อีเมล Java regex


121

ก่อนอื่นฉันรู้ว่าไม่แนะนำให้ใช้ regex สำหรับอีเมล แต่ฉันต้องทดสอบสิ่งนี้

ฉันมี regex นี้:

\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

ใน Java ฉันทำสิ่งนี้:

Pattern p = Pattern.compile("\\b[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b");
Matcher m = p.matcher("foobar@gmail.com");

if (m.find())
    System.out.println("Correct!");

อย่างไรก็ตาม regex จะล้มเหลวไม่ว่าอีเมลนั้นจะขึ้นรูปหรือไม่ก็ตาม "ค้นหาและแทนที่" ภายใน Eclipse ทำงานได้ดีกับ regex เดียวกัน

ความคิดใด ๆ ?

ขอบคุณ


3
ปัญหาอย่างหนึ่งของ regexp ของคุณคือการคำนึงถึงขนาดตัวพิมพ์ คุณควรใช้ตัวสร้าง Patterm.compile ("... ", Pattern.CASE_INSENSITIVE) สำหรับรูปแบบของคุณ
Jason Buberel

1
เหตุใด ti จึงไม่แนะนำให้ใช้ regex สำหรับการตรวจสอบอีเมลใน Java
Filipe Miranda

emailregex.comใช้ regex ที่ได้รับจากไซต์นี้ อ้างว่ามี regex อีเมลที่ถูกต้อง 99.99%
Menuka Ishan

คำตอบ:


247

FWIW นี่คือรหัส Java ที่เราใช้เพื่อตรวจสอบที่อยู่อีเมล Regexp นั้นคล้ายกันมาก:

public static final Pattern VALID_EMAIL_ADDRESS_REGEX = 
    Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);

public static boolean validate(String emailStr) {
        Matcher matcher = VALID_EMAIL_ADDRESS_REGEX.matcher(emailStr);
        return matcher.find();
}

ทำงานได้ค่อนข้างน่าเชื่อถือ


5
ตัวอย่างสองตัวอย่าง: webmaster@müller.de (ถูกต้องและถูกปฏิเสธโดยตัวอย่างของคุณ), matteo@78.47.122.114 (อีเมลของฉันถูกต้องและถูกปฏิเสธโดยตัวอย่างของคุณ
Matteo

10
นิพจน์ทั่วไปนี้ไม่สมบูรณ์ ดูคำตอบของฉันสำหรับการตรวจสอบความถูกต้องตามข้อกำหนด RFC 822
ejboy

15
สำหรับวิธีง่ายๆที่ตรงกับ 99.9% ของที่อยู่อีเมลนี่เป็นทางออกที่ดี
maloney

ตรวจสอบregexนี้ว่าตรงกับทั้งสองอีเมลของคุณ @Matteo
T04435

@ T04435 regex ในลิงก์ของคุณไม่ได้หนีจาก DOT สิ่งที่ทำให้ regex ทำงานผิดพลาดและสิ่งนี้ยังส่งผลกระทบต่อประสิทธิภาพอย่างรุนแรงด้วย
TomWolk

173

นี่คือ regex ที่สอดคล้องกับ RFC822 ที่ดัดแปลงสำหรับ Java:

Pattern ptr = Pattern.compile("(?:(?:\\r\\n)?[ \\t])*(?:(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*)|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*:(?:(?:\\r\\n)?[ \\t])*(?:(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*)(?:,\\s*(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*))*)?;\\s*)");
String[] emails = { "\"Fred Bloggs\"@example.com", "user@.invalid.com", "Chuck Norris <gmail@chucknorris.com>", "webmaster@müller.de", "matteo@78.47.122.114" };
for (String email : emails) {
    System.out.println(email + " is " + (ptr.matcher(email).matches() ? "valid" : "invalid"));
}

เอาท์พุท:

"Fred Bloggs"@example.com is valid
user@.invalid.com is invalid
Chuck Norris <gmail@chucknorris.com> is valid
webmaster@müller.de is valid
matteo@78.47.122.114 is valid

regex จะนำมาจากบทความนี้: จดหมาย :: RFC822 :: ที่อยู่: ตรวจสอบที่อยู่ ผลควรตรงกับรุ่นออนไลน์


2
ฉันคิดว่าเขาลดระดับลงเพราะต้องใช้อักขระพิเศษเช่น "ก่อนคอมไพล์ด้วยตนเองเว้นแต่จะมีข้อผิดพลาดทางไวยากรณ์
Isuru Madusanka

1
ขอบคุณ Isuru! ฉันจำได้ว่าฉันใช้ regex นี้กับหนึ่งในโปรเจ็กต์ของฉันเมื่อสองสามปีก่อน แต่ฉันลืมไปว่ามันต้องใช้การขัดเงาเล็กน้อยเพื่อให้แบนและหลีกเลี่ยงได้อย่างเหมาะสม จริงๆแล้ว IntelliJ ทำได้ดีในการหลีกเลี่ยงนิพจน์ที่วางไว้ในเครื่องหมายคำพูดคู่โดยอัตโนมัติ
ejboy

5
รูปแบบนี้ตรวจสอบความถูกต้องกับข้อมูลจำเพาะ RFC822 แต่ไม่ตอบว่าที่อยู่อีเมลชี้ไปยังเซิร์ฟเวอร์อีเมลที่มีอยู่หรือไม่ นอกจากนี้โดเมนระดับบนสุดยังไม่ จำกัด เพียง 3 ตัวอักษร มี TLD ที่ยาวขึ้นและรายการกำลังเติบโต IMO วิธีเดียวในการตรวจสอบความถูกต้องสำหรับกรณีที่ต้องการตรวจสอบการมีอยู่ของเซิร์ฟเวอร์อีเมลคือการแก้ไขชื่อโฮสต์ผ่าน DNS และ / หรือพยายามค้นหาระเบียน mx
ejboy

5
นี้ยืนยันemail@emailว่าเป็นอีเมลที่ถูกต้อง
lxknvlk

2
ทำเครื่องหมาย "Matt Röder" @ gmail.com ว่าถูกต้องซึ่งไม่สอดคล้องกับ RFC822 หากฉันถูกต้อง
Askar Kalykov

15

อย่า คุณจะไม่จบลงด้วยการแสดงออกที่ถูกต้อง

ตัวอย่างเช่นที่อยู่อีเมลที่ถูกต้องทั้งหมด:

"Abc\@def"@example.com
"Fred Bloggs"@example.com
"Joe\\Blow"@example.com
"Abc@def"@example.com
customer/department=shipping@examp­ le.com
$A12345@example.com
!def!xyz%abc@example.com
_somename@example.com
matteo(this is a comment).corti@example.com
root@[127.0.0.1]

เพียงแค่พูดถึงปัญหาเล็กน้อย:

  • คุณไม่พิจารณารูปแบบต่างๆของการระบุโฮสต์ (เช่นตามที่อยู่ IP)
  • คุณพลาดอักขระที่ถูกต้อง
  • คุณคิดถึงชื่อโดเมนที่ไม่ใช่ ASCII

ก่อนที่จะเริ่มตรวจสอบ RFC ที่เกี่ยวข้อง


2
อีเมลที่มีช่องว่าง? ดูเหมือนว่าจะไม่ถูกต้องแม้ว่าบางแห่งจะมีการตัดสินว่าอีเมลสามารถมีช่องว่างได้
The Berga

emailregex.com ไซต์นี้อ้างว่ามี regex ที่ถูกต้อง 99% สำหรับอีเมล
Menuka Ishan

1
@MenukaIshan ในขณะที่พวกเขาอ้างว่าตัวเอง regex จะไม่ตกลงอย่างสมบูรณ์ คุณสามารถทดสอบหลายตัวอย่างด้านบน ตอนนี้คำถามคือทำไมต้องยึดติดกับ regeres ที่มีการใช้งานที่ได้ผล?
Matteo

1
@Matteo ช่วยยกตัวอย่างที่ไม่ต้องใช้ regex ได้ไหม? ฉันรู้เกี่ยวกับ Hibernate Validator @ Email annotation คุณกำลังพูดถึงประเภทนั้นอยู่หรือเปล่า? อย่างไรก็ตามฉันอยากทราบตัวอย่างของคุณเพื่อที่ฉันจะได้นำไปใช้ในการพัฒนาในอนาคตของฉัน ขอบคุณ.
Menuka Ishan

กำลังใช้ภาษาใด
Matteo

7

นั่นเป็นเพราะคุณลืมกรณีที่ไม่รู้สึกตัว:

Pattern regex = Pattern.compile("\\b[\\w.%-]+@[-.\\w]+\\.[A-Za-z]{2,4}\\b");

สิ่งนี้ตรงกับตัวอย่างของคุณแม้ว่าจะไม่สนใจอีเมลที่ถูกต้องจำนวนมากก็ตาม


5

อีกหนึ่งทางเลือกง่ายๆในการตรวจสอบความถูกต้องของอีเมล 99%

public static final String EMAIL_VERIFICATION = "^([\\w-\\.]+){1,64}@([\\w&&[^_]]+){2,255}.[a-z]{2,}$";

1
ฉันชอบอันนี้เพราะมันเรียบง่ายและเข้าใจได้สิ่งหนึ่งที่ขาดหายไปคือการรองรับภาษาต่างประเทศ (föö@bar.comใช้ได้แล้วในปัจจุบัน) เพียงแค่เปลี่ยน \ w สำหรับ \ p {L} ก็อนุญาตให้ใช้ตัวอักษรภาษาใดก็ได้ ฉันลงเอยด้วย: "^ ([\ p {L} -_ \.] +) {1,64} @ ([\ p {L} -_ \.] +) {2,255}. [az] {2 ,} $ "
Tobi Nonymous

3

นี่คือนิพจน์ทั่วไปที่ถูกต้องสำหรับการตรวจสอบความถูกต้องของอีเมล เป็นไปตาม RFC822 โดยสิ้นเชิงและยอมรับที่อยู่ IP และชื่อเซิร์ฟเวอร์ (เพื่อวัตถุประสงค์ในอินทราเน็ต)

public static boolean isEmailValid(String email) {
    final Pattern EMAIL_REGEX = Pattern.compile("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", Pattern.CASE_INSENSITIVE);
    return EMAIL_REGEX.matcher(email).matches();
}

นี่คือตัวอย่างผลลัพธ์บางส่วนเมื่อคุณโทรisEmailValid(emailVariable):

john@somewhere.com // valid
john.foo@somewhere.com // valid
john.foo+label@somewhere.com // valid (with +label - Gmail accepts it!)
john@192.168.1.10 // valid (with IP addresses)
john+label@192.168.1.10 // valid (with +label and IP address)
john.foo@someserver // valid (with no first domain level)
JOHN.FOO@somewhere.com // valid (case insensitive)
@someserver // invalid
@someserver.com // invalid
john@. // invalid
.@somewhere.com // invalid


1

คุณสามารถใช้วิธีนี้เพื่อตรวจสอบที่อยู่อีเมลใน java

public class EmailValidator {
    private Pattern pattern;
    private Matcher matcher;

    private static final String EMAIL_PATTERN = 
        "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
        + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

    public EmailValidator() {
        pattern = Pattern.compile(EMAIL_PATTERN);
    }

    /**
    * Validate hex with regular expression
    * 
    * @param hex
    *            hex for validation
    * @return true valid hex, false invalid hex
    */
    public boolean validate(final String hex) {

    matcher = pattern.matcher(hex);
    return matcher.matches();

    }
}

1

รูปแบบอีเมลทั่วไป (RE) ซึ่งรวมถึงโดเมนเช่น co.in, co.uk, com, outlook.com เป็นต้น

และกฎบอกว่า:

  • ตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก (az, AZ)
  • ตัวเลข 0 ถึง 9
  • ตัวละคร! # $% & '* + - / =? ^ _ `{| } ~ ตัวละคร.
  • (จุด, จุด, จุดหยุดเต็ม) โดยที่ไม่ใช่อักขระตัวแรกหรือตัวสุดท้ายและหากไม่ปรากฏสองครั้งขึ้นไปติดกัน

    [a-zA-Z0-9]+[._a-zA-Z0-9!#$%&'*+-/=?^_`{|}~]*[a-zA-Z]*@[a-zA-Z0-9]{2,8}.[a-zA-Z.]{2,6}

1

การแก้ไขคำตอบ Armer B. ซึ่งไม่ได้ตรวจสอบความถูกต้องของอีเมลที่ลงท้ายด้วย ".co.uk"

public static boolean emailValidate(String email) {
    Matcher matcher = Pattern.compile("^([\\w-\\.]+){1,64}@([\\w&&[^_]]+){2,255}(.[a-z]{2,3})+$|^$", Pattern.CASE_INSENSITIVE).matcher(email);

    return matcher.find();
}

0

Regex: ^[\\w!#$%&’*+/=?{|} ~ ^ -] + (?: \. [\ w! # $% & '* + / =?{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$

public static boolean isValidEmailId(String email) {
        String emailPattern = "^[\\w!#$%&’*+/=?`{|}~^-]+(?:\\.[\\w!#$%&’*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$";
        Pattern p = Pattern.compile(emailPattern);
        Matcher m = p.matcher(email);
        return m.matches();
    }

0

หากคุณต้องการอนุญาตให้ใช้อักขระที่ไม่แฝงตัวนี้ก็ใช้ได้ดีสำหรับฉัน

"^[\\p{L}\\p{N}\\._%+-]+@[\\p{L}\\p{N}\\.\\-]+\\.[\\p{L}]{2,}$"

ไม่อนุญาตให้ IP อยู่หลัง @ แต่อีเมลที่ถูกต้องที่สุดใน from of xxx@xxx.TDLสามารถตรวจสอบได้ด้วย \p{L}ตรวจสอบ UTF-Letters และ\p{N}ตรวจสอบหมายเลข UTF คุณสามารถตรวจสอบเอกสารนี้สำหรับข้อมูลเพิ่มเติม


0

ลองใช้รหัสด้านล่างสำหรับอีเมลเป็นรูปแบบของ

jsmith@example.com

ส่วนที่ 1 ส่วนที่-jsmith 2-@example.com

1. In the 1 part it will allow 0-9,A-Z,dot sign(.),underscore sign(_)
 2. In the 2 part it will allow A-Z, must be @ and .

^[a-zA-Z0-9_.]+@[a-zA-Z.]+?\.[a-zA-Z]{2,3}$

0

ฉันได้ทดสอบสิ่งนี้ด้านล่างregular expressionสำหรับจุดเดียวและหลายจุดในdomainชื่อ -

([A-Za-z0-9-_.]+@[A-Za-z0-9-_]+(?:\.[A-Za-z0-9]+)+)

regexและนี่คือตัวอย่างที่ได้รับการเติมเต็มอย่างสมบูรณ์โดยการดังกล่าวข้างต้น

End_user@live.com
End.u@exm-tech.net
enduser9876@gmail.in
end_user@mywebsite.ac.in.gui
Another984.User2@mail.edu.sg
Another987_User5@mail.show.au
Slow_User@example_domain.au.in
iamthemostsimpleremailhere@example.com

ฉันได้พยายามครอบคลุมค่าสูงสุดที่ใช้ email id's validationโดยภาพประกอบข้างต้นนี้regexและยังใช้งานได้ ...

หากคุณยังคงทราบว่ามีการใช้งานตามมาบางส่วนemail id'sได้ทิ้งไว้ที่นี่โปรดแจ้งให้เราทราบในส่วนความคิดเห็น!


0
String emailRegex = "[a-zA-Z0-9_.]+@[a-zA-Z0-9]+.[a-zA-Z]{2,3}[.] {0,1}[a-zA-Z]+";
Pattern.matches(emailRegex,"You_Input_Mail_Id");

นี่คือนิพจน์ทั่วไปที่จับคู่ที่อยู่อีเมลที่ถูกต้อง


ลองเพิ่มการจัดรูปแบบและบริบทให้กับโค้ดของคุณเพื่อช่วยให้ผู้อ่านในอนาคตเข้าใจความหมายของมันได้ดีขึ้น
Grant Miller

0

คุณสามารถใช้นิพจน์ทั่วไปง่ายๆในการตรวจสอบรหัสอีเมล

public boolean validateEmail(String email){
  return Pattern.matches("[_a-zA-Z1-9]+(\\.[A-Za-z0-9]*)*@[A-Za-z0-9]+\\.[A-Za-z0-9]+(\\.[A-Za-z0-9]*)*", email)
}

คำอธิบาย:

  1. [_a-zA-Z1-9] + - จะยอมรับ AZ, az, 0-9 และ _ ทั้งหมด (+ หมายความว่าจะต้องเกิดขึ้น)
  2. (\. [A-Za-z0-9] ) - เป็นทางเลือกซึ่งจะยอมรับ และ AZ, az, 0-9 (* หมายถึงทางเลือก)
  3. @ [A-Za-z0-9] + - จะยอมรับ @ และ AZ, az, 0-9
  4. \. [A-Za-z0-9] + - สำหรับ. และ AZ, az, 0-9
  5. (\. [A-Za-z0-9] ) - มันเกิดขึ้น,. แต่เป็นทางเลือก

0

คุณสามารถตรวจสอบว่าอีเมลถูกต้องหรือไม่โดยใช้ libreries นี้และแน่นอนว่าคุณสามารถเพิ่มอาร์เรย์สำหรับโปรเจ็กต์ต่อไปนี้ได้

import org.apache.commons.validator.routines.EmailValidator;

public class Email{
    public static void main(String[] args){
        EmailValidator email = EmailVlidator.getInstance();
        boolean val = email.isValid("george.parcks@gmail.com");
        System.out.println("Mail is: "+val);
        val = email.isValid("hans.riguer.hotmsil.com");
        System.out.print("Mail is: "+val");
    }
}

เอาต์พุต:

Mail is: true

จดหมายคือ: เท็จ


ดีที่เป็นไลบรารี แต่ regex ที่ใช้นั้นง่ายมาก ... EMAIL_REGEX = "^ \\ s *? (. +) @ (. +?) \\ s * $";
Milo van der Zee

0
import java.util.Scanner;

public class CheckingTheEmailPassword {

    public static void main(String[] args) {
        String email = null;
        String password = null;
        Boolean password_valid = false;
        Boolean email_valid = false;

        Scanner input = new Scanner(System.in);
        do {
            System.out.println("Enter your email: ");
            email = input.nextLine();

            System.out.println("Enter your passsword: ");
            password = input.nextLine();

            // checks for words,numbers before @symbol and between "@" and ".".
            // Checks only 2 or 3 alphabets after "."
            if (email.matches("[\\w]+@[\\w]+\\.[a-zA-Z]{2,3}"))
                email_valid = true;
            else
                email_valid = false;

            // checks for NOT words,numbers,underscore and whitespace.
            // checks if special characters present
            if ((password.matches(".*[^\\w\\s].*")) &&
            // checks alphabets present
                    (password.matches(".*[a-zA-Z].*")) &&
                    // checks numbers present
                    (password.matches(".*[0-9].*")) &&
                    // checks length
                    (password.length() >= 8))
                password_valid = true;
            else
                password_valid = false;

            if (password_valid && email_valid)
                System.out.println(" Welcome User!!");
            else {
                if (!email_valid)
                    System.out.println(" Re-enter your email: ");
                if (!password_valid)
                    System.out.println(" Re-enter your password: ");
            }

        } while (!email_valid || !password_valid);

        input.close();

    }

}

0

ขอบคุณคำตอบของ @Jason Buberel ฉันคิดว่าตัวอักษรตัวพิมพ์เล็กต้องได้รับการตรวจสอบความถูกต้องโดย RegEX ดังนั้นสิ่งต่อไปนี้ถูกต้อง:

[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}

ตอนนี้ทั้งdeveloper961@mail.comและDEV961@yahoo.COMใช้ได้แล้ว!
โปรดทราบว่า\. ควรจะเป็น\\. ที่จะหลบหนี . และมี\. ตัวเอง ตั้งแต่, . เป็นอักขระที่มีความหมายใน java RegEX หมายถึงอักขระทั้งหมด


คำตอบของ Jason ใช้Pattern.CASE_INSENSITIVEจึงไม่จำเป็นสำหรับa-z
Toto

-1

Regex สำหรับการตรวจสอบความถูกต้องเหมือน Facebook:

public static final String REGEX_EMAIL_VALIDATION = "^[\\w-\\+]+(\\.[\\w]+)*@[\\w-]+(\\.[\\w]+)*(\\.[a-zA-Z]{2,})$";

Dto สำหรับการทดสอบหน่วย (กับลอมบอก):

@Data
@Accessors(chain = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserCreateDto {

    @NotNull
    @Pattern(regexp = REGEX_EMAIL_VALIDATION)
    @Size(min = 1, max = 254)
    String email;
}

อีเมลที่ถูกต้อง / ไม่ถูกต้องด้านล่างพร้อมการทดสอบหน่วย:

public class UserCreateValidationDtoTest {

private static final String[] VALID_EMAILS = new String[]{"email@yahoo.com", "email-100@yahoo.com",
        "Email.100@yahoo.com", "email111@email.com", "email-100@email.net",
        "email.100@email.com.au", "emAil@1.com", "email@gmail.com.com",
        "email+100@gmail.com", "emAil-100@yahoo-test.com", "email_100@yahoo-test.ABC.CoM"};
private static final String[] INVALID_EMAILS = new String[]{"あいうえお@example.com", "email@111",
        "email", "email@.com.my", "email123@gmail.", "email123@.com", "email123@.com.com",
        ".email@email.com", "email()*@gmAil.com", "eEmail()*@gmail.com", "email@%*.com", "email..2002@gmail.com",
        "email.@gmail.com", "email@email@gmail.com", "email@gmail.com."};
private Validator validator;

@Before
public void setUp() throws Exception {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    validator = factory.getValidator();
}

@Test
public void emailValidationShouldBeValid() throws Exception {
    Arrays.stream(VALID_EMAILS)
            .forEach(email -> {
                        Set<ConstraintViolation<UserCreateDto>> violations = validateEmail(
                                new UserCreateDto().setEmail(email));
                        System.out.println("Email: " + email + ", violations: " + violations);
                        Assert.assertTrue(violations.isEmpty());
                    }
            );
}

@Test
public void emailValidationShouldBeNotValid() throws Exception {
    Arrays.stream(INVALID_EMAILS)
            .forEach(email -> {
                        Set<ConstraintViolation<UserCreateDto>> violations = validateEmail(
                                new UserCreateDto().setEmail(email));
                        System.out.println("Email: " + email + ", violations: " + violations);
                        Assert.assertTrue(!violations.isEmpty());
                    }
            );
}


private Set<ConstraintViolation<UserCreateDto>> validateEmail(UserCreateDto user) {
    String emailFieldName = "email";
    return validator.validateProperty(user, emailFieldName);
}

}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.