java - 验证电子邮件(不发送确认)

标签 java regex validation email-validation

验证电子邮件不是一个选项:(

我需要使用一组非常具体的规则来验证电子邮件地址。我尝试过 Apache Commons 库以及 JavaMail 库;尽管两者都遵守 RFC 2822,但根据我的规则,一些无效的电子邮件仍然可以通过。我一直在尝试使用正则表达式(regex?),但没有成功。我知道我知道。正则表达式不是最好的选择,可能会花费大量时间并增加复杂性。尽管如此,我认为既然我用不太困难的术语概述了规则,那么为这个特定实例构建一个规则就足够了。

规则:

  1. 电子邮件地址的本地部分可以使用以下任意一项:
    • 大小写字母
    • 数字 0-9
    • 特殊字符: , ! # $ % ^ & * ( ) ' ` + = - _ { } | 〜
    • 句点,但不能以句点开头或结尾
    • 不得包含连续的句点
  2. 电子邮件的本地部分和域部分之间必须有一个 At 符号 (@)
  3. 域名只能包含字母、数字、下划线、句点和连字符
    • 不能以连字符开头
    • 不能以连字符结尾
    • 不能包含两个连续的连字符
  4. 电子邮件的域名和 TLD 部分之间必须有句点
    • TLD 只能包含字母
    • TLD 不得以句点结尾

到目前为止,我一直在尝试使用以下正则表达式:

<删除> ^((?!.\.{2,}.)[^.][-a-zA-Z0-9_.\!\@\#\$\%\^\&\*\(\)\,\'\+\=\`\{\|\}\~\-]+[^.])@((?!.\-{2,}.)[^-_][-a-zA- Z0-9_.]+[^-_]\.[a-zA-z]+)$


^((?!.\.{2,}.)[^.][-a-zA-Z0-9_.!@#$%^&*(),'+=`{|}~-]+[^.])@((?!.\-{2,}.)[^-_][-a-zA-Z0-9_.]+[^-_]\.[a-zA-z]+)$

由于电子邮件无效(例如 juSTLikethat@gm--ail.com),这仍然失败。

我在正则表达式中遗漏了什么或做错了什么?有没有其他方法可以确保电子邮件符合要求而无需正则表达式?

提前致谢!

附注这是在 Java 中,因此上述正则表达式中的所有转义字符都必须进行双重转义(例如 \.\\.)。我也一直在使用Regexper帮助我想象这一点,因为我显然不是正则表达式专家。

最佳答案

我建议:

拆分@象征。在最后一个周期上拆分(使用 String#substring String#lastIndexOf )。现在您已将本地部分、域和 TLD 全部放在单独的字符串中,使用 if 语句进行验证。如果有任何规则适用于所有(2 个连续周期?),请在拆分之前执行此操作。更容易正确操作、更容易理解、更容易维护。

但是,如果您真的想坚持使用正则表达式,这里有一些我看到的东西:

[^.]之前@应该是(?<!\.) ,否则为 @ 之前的最后一个字符可以是任何东西。

. 只是一个字符,所以 (?!.\-{2,}.)(?!.\.{2,}.)不做你认为它做的事。刚刚成功.*似乎可以修复它。而且您不需要在您要查找的内容之后检查任何字符。

尚未明确说明,但我认为域名和 TLD 也不能包含 2 个连续的句点。如果允许,则正则表达式的第一部分需要是 (?!.*\.{2,}.*@)停在 @ .

如果您使用 String#matches ^$不是必需的。

有一些不需要的()的。

最终正则表达式:

(?!.*\.{2,})[^.][-a-zA-Z0-9_.!@#$%^&*(),'+=`{|}~-]+(?<!\.)@(?!.*\-{2,})[^-_][-a-zA-Z0-9_.]+[^-_]\.[a-zA-z]+

如果您选择坚持使用正则表达式,我建议进行广泛的评论:

String regex =
          "(?!.*\\.{2,})" // doesn't contain 2 consecutive .'s
       // local part
          + "[^.]" // doesn't start with a .
          + "[-a-zA-Z0-9_.!@#$%^&*(),'+=`{|}~-]+" // valid chars for local part
          + "(?<!\\.)" // last char of local part isn't a .
       // at symbol
          + "@"
       // domain
          ...

这可能看起来有点矫枉过正,但如果您尝试在几个月后维护它,您会希望自己拥有它,特别是如果您在那几个月没有接触过任何正则表达式的话。

关于java - 验证电子邮件(不发送确认),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16700394/

相关文章:

java - 如何在 Java 中验证 Gmail 地址

c# - 值是逗号而不是点的范围验证

Java:何时使用线程池的指南?

java - 将字符串单独分成数组

c++ - QRegExp 只是不匹配!请告诉我我做错了什么

regex - 使用 Bash (sed?) 删除包含特定文本的多行/* ... */样式注释(正则表达式)

Java 从文件中读取对象 vector 仅读取 vector 中的第一个对象

java - HashMap 被最后一个值覆盖

python - re.sub() 在多行之间替换

javascript - 简单的 JavaScript IBAN 验证