RegEx电子邮件验证问题

时间:2013-08-27 15:12:32

标签: java regex

在我提出问题之前,让我先说一下:我对电子邮件地址验证有一套严格的要求。我试图对其中的一些提出异议,但被推翻了。

无论如何,要求如下:

  • 没有连续的时间段
  • pos 1
  • 中没有特殊字符
  • @
  • 之前或之后没有句号
  • 允许以下字符:+!#$%& * / =?`{|}〜'_ - 。

我满足要求的尝试是成功的,只有一个障碍。由于我用于本地部分的正则表达式,现在需要至少3个字符的错误。这是我的尝试:

(^(?!.*\\.{2})([a-zA-Z0-9{1}]+[a-zA-Z0-9\\._\\-\\+!#$%&*/=?`{|}~']+[a-zA-Z0-9{1}])+@([a-zA-Z0-9{1}]+[a-zA-Z0-9\\-]+[a-zA-Z0-9{1}]+\\.)+([a-zA-Z0-9\\-]{2}|net|com|gov|mil|org|edu|int|NET|COM|GOV|MIL|ORG|EDU|INT)$)|^$

我理解为什么会这样,我只是不知道如何绕过它。非常感谢任何帮助。

已编辑:经过多次讨论后,发现我的问题并非特定于电子邮件地址的本地部分。域名部分也遇到了同样的问题。

谢谢, SEB

2 个答案:

答案 0 :(得分:2)

对于本地部分@之前的部分),这是满足上述所有条件的正则表达式片段:

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

故障:

^                                 # Beginning of the string
[a-zA-Z0-9]                       # First character is not special
[a-zA-Z0-9+!#$%&*/=?`{|}~'_-]*    # 0 or more alphanumeric and special characters, except .
(?:                               # Group, repeated 0 or more times
  \.                              # A literal .
  [a-zA-Z0-9+!#$%&*/=?`{|}~'_-]+  # 1 or more alphanumeric and special characters, except .
)*

“没有连续的时间段”.只能出现在{1}之间,因此强制实施@ {>条件之前或之后的时间段2个非点字符,如上面的正则表达式所示。

我不完全了解电子邮件规范,因此即使它满足问题中的条件,我也无法保证电子邮件是符合规范的有效电子邮件


域名部分在字符类中有-同样的问题

我冒昧地使用hostname上的限制,其中标签不得以[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)* 开头或结尾。

[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)*\.(?i:[a-z0-9]{2}|net|com|gov|mil|org|edu|int)

如果您想强制执行TLD:

i

请注意,我使用带有{{1}}标记的非捕获组使TLD不区分大小写。

答案 1 :(得分:0)

请你试试这个(只需稍微修改一下代码):

(^(?!.*\\.{2})([a-zA-Z0-9][a-zA-Z0-9\\._\\-\\+!#$%&*/=?`{|}~']+[a-zA-Z0-9])+@([a-zA-Z0-9]+[a-zA-Z0-9\\-]+[a-zA-Z0-9]\\.)+([a-zA-Z0-9\\-]{2}|net|com|gov|mil|org|edu|int|NET|COM|GOV|MIL|ORG|EDU|INT)$)|^$

(到目前为止提供的测试地址有效。它们都不匹配。)