【问题标题】:Java regex emailJava 正则表达式电子邮件
【发布时间】:2012-01-02 12:44:36
【问题描述】:

首先,我知道不建议对电子邮件使用正则表达式,但我必须对此进行测试。

我有这个正则表达式:

\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!");

但是,无论电子邮件格式是否正确,正则表达式都会失败。 Eclipse 中的“查找和替换”可以使用相同的正则表达式正常工作。

有什么想法吗?

谢谢,

【问题讨论】:

  • 您的正则表达式的一个问题是区分大小写。您应该为您的模式使用 Patterm.compile("...", Pattern.CASE_INSENSITIVE) 构造函数。
  • 为什么不建议在 Java 中使用正则表达式进行电子邮件验证?
  • emailregex.com 使用本网站提供的正则表达式。它声称有 99.99% 正确的电子邮件正则表达式

标签: java regex email


【解决方案1】:

FWIW,这是我们用来验证电子邮件地址的 Java 代码。正则表达式非常相似:

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();
}

工作相当可靠。

【讨论】:

  • 对于匹配 99.9% 的电子邮件地址的简单解决方案,这是一个很好的解决方案。
【解决方案2】:

这是适用于 Java 的符合 RFC822 的正则表达式:

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

正则表达式取自这篇文章:Mail::RFC822::Address: regexp-based address validation。结果应该与online version一致。

【讨论】:

    【解决方案3】:

    不要。你永远不会得到一个有效的表达式。

    例如,这些都是有效的电子邮件地址:

    "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

    【讨论】:

    • 带有空格的电子邮件?即使在某个地方决定电子邮件可以有空格,这似乎也很无效。
    • @MenukaIshan 因为他们声称自己的正则表达式永远不会完全正常。您可以测试上面的几个示例。现在的问题是,为什么要在有有效实现的地方坚持使用 regeres?
    • @Matteo 你能给我这样不需要正则表达式的例子吗?我知道 Hibernate Validator @Email 注释。你说的是那种类型的东西吗?无论如何,我很想知道您的示例,以便我能够在未来的开发中使用它们。谢谢。
    • 使用哪种语言?
    【解决方案4】:

    那是因为你忘记了不区分大小写:

    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,}$";
      

      【讨论】:

      • 我喜欢这个,因为它简单易懂,缺少的一件事是国际语言支持(föö@bar.com 现在有效)只需将 \w 切换为 \p{L} 就可以了任何语言的字母。我最终得到:“^([\p{L}-_\.]+){1,64}@([\p{L}-_\.]+){2,255}.[az]{2 ,}$"
      【解决方案6】:

      这是用于验证电子邮件的有效正则表达式。它完全符合 RFC822 并接受 IP 地址和服务器名称(用于 Intranet 目的)。

      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
      

      【讨论】:

        【解决方案7】:

        是否设置为CASE_INSENSITIVE

        【讨论】:

          【解决方案8】:

          您可以使用此方法在 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();
          
              }
          }
          

          【讨论】:

            【解决方案9】:

            一般电子邮件格式 (RE),其中还包括 co.in、co.uk、com、outlook.com 等域。

            规则说:

            • 大写和小写英文字母(a-z、A-Z)
            • 数字 0 到 9
            • 字符! # $ % & ' * + - / = ? ^ _ ` { | } ~ 字符。
            • (点、句号、句号)只要它不是第一个或最后一个 字符,并且还提供它不出现两个或多个 连续多次。

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

            【讨论】:

              【解决方案10】:

              修改了未验证以“.co.uk”结尾的电子邮件的 Armer B. 答案

              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();
              }
              

              【讨论】:

                【解决方案11】:
                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();
                
                    }
                
                }
                

                【讨论】:

                  【解决方案12】:

                  感谢@Jason Buberel 的回答,我认为小写字母必须由RegEX 验证。所以以下是正确的:

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

                  现在,developer961@mail.comDEV961@yahoo.COM 都有效!
                  注意 \. 应该是 \\. 才能转义。并拥有 \. 本身。因为 . 在 java 中是一个有意义的字符 RegEX 表示所有字符。

                  【讨论】:

                  • Jason 的回答使用Pattern.CASE_INSENSITIVE,所以不需要a-z
                  【解决方案13】:

                  我看到这篇文章并尝试了一些答案,但没有找到一个支持我需要的所有东西的答案。

                  • Unicode 字符在我们的例子中,特别是德语 (ÄÖÜäöüß)
                  • gmail + 功能:my.gmail+@gmail.com

                  我在https://www.baeldung.com/java-email-validation-regex 找到了完整的模式列表,在那里我找到了 unicode 和 gmail 方法:

                  uniCodeRegex = "^(?=.{1,64}@)[\\p{L}0-9_-]+(\\.[\\p{L}0-9_-]+)*@" 
                      + "[^-][\\p{L}0-9-]+(\\.[\\p{L}0-9-]+)*(\\.[\\p{L}]{2,})$";
                  gmailRegex = "^(?=.{1,64}@)[A-Za-z0-9\\+_-]+(\\.[A-Za-z0-9\\+_-]+)*@" 
                      + "[^-][A-Za-z0-9\\+-]+(\\.[A-Za-z0-9\\+-]+)*(\\.[A-Za-z]{2,})$";
                  

                  TL,DR: 并通过将 A-Za-z 替换为 \\p{L} 来组合它们以获取 unicode 字母

                  combined = "^(?=.{1,64}@)[\\p{L}0-9\\+_-]+(\\.[\\p{L}0-9\\+_-]+)*@"
                          + "[^-][\\p{L}0-9\\+-]+(\\.[\\p{L}0-9\\+-]+)*(\\.[\\p{L}]{2,})$"
                  

                  Kotlin 测试示例:

                  val p = Pattern.compile(patternRegex)
                  assertThat(p.matcher("user@domain.com").find()).isTrue()
                  

                  【讨论】:

                    【解决方案14】:

                    正则表达式:^[\\w!#$%&amp;’*+/=?{|}~^-]+(?:\.[\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();
                        }
                    

                    【讨论】:

                      【解决方案15】:

                      如果你想允许非拉丁字符,这个对我来说效果很好。

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

                      它不允许在@ 之后使用IP,但xxx@xxx.TDL 中的大多数有效电子邮件都可以使用它进行验证。 \p{L} 验证 UTF-Letters,\p{N} 验证 UTF-Numbers。您可以查看this doc了解更多信息。

                      【讨论】:

                        【解决方案16】:

                        试试下面的代码,电子邮件的格式是

                        jsmith@example.com
                        

                        第一部分-jsmith第二部分-@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}$
                        

                        【讨论】:

                          【解决方案17】:

                          我在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
                          

                          我已尝试通过上面说明的regex 覆盖常用的最大值 email id's validation,但仍在工作......

                          如果您仍然知道一些相应使用的email id's 离开了这里,请在评论部分告诉我!

                          【讨论】:

                            【解决方案18】:
                            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");
                            

                            这是匹配有效电子邮件地址的正则表达式。

                            【讨论】:

                            • 尝试为您的代码添加一些格式和上下文,以帮助未来的读者更好地理解其含义。
                            【解决方案19】:

                            您可以使用简单的正则表达式来验证电子邮件 ID,

                            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]+ - 它将接受所有 A-Z、a-z、0-9 和 _(+ 表示必须出现)
                            2. (\.[A-Za-z0-9]) - 可以选择接受 .和 A-Z、a-z、0-9(* 表示其可选)
                            3. @[A-Za-z0-9]+ - 它将接受 @ 和 A-Z,a-z,0-9
                            4. \.[A-Za-z0-9]+ - 用于 .和 A-Z,a-z,0-9
                            5. (\.[A-Za-z0-9]) - 它发生,.但它是可选的

                            【讨论】:

                              【解决方案20】:

                              您可以使用此库检查电子邮件是否有效,当然您可以为以下项目添加数组。

                              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");
                                  }
                              }
                              

                              输出:

                              邮件是:是的

                              邮件是:假

                              【讨论】:

                              • 很高兴它是一个库,但使用的正则表达式非常简单... EMAIL_REGEX = "^\\s*?(.+)@(.+?)\\s*$";
                              【解决方案21】:

                              如果您使用 Java Bean Validation,则可以使用 javax.validation.constraints.Email 注释来验证电子邮件。

                              如果你想手动做,可以看看Hibernate Validator(Java Bean Validation implementation)是怎么做的:

                              https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators/AbstractEmailValidator.java

                              【讨论】:

                                【解决方案22】:

                                用于类似 Facebook 的验证的正则表达式:

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

                                用于单元测试的 Dto(使用 Lombok):

                                @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);
                                }
                                

                                }

                                【讨论】:

                                  猜你喜欢
                                  • 2015-12-03
                                  • 2011-01-16
                                  • 1970-01-01
                                  • 2011-12-28
                                  • 1970-01-01
                                  • 2011-02-15
                                  相关资源
                                  最近更新 更多