0

在我开始提问之前,让我先介绍一下:关于电子邮件地址验证,我有一套严格的要求要遵循。我试图对其中一些提出异议,但被否决了。

无论如何,其中的要求如下:

  • 没有连续的时期
  • 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)$)|^$

我明白为什么会发生这种情况,我只是不知道如何解决它。任何帮助将不胜感激。

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

谢谢, 赛布

4

2 回答 2

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 .
)*

如上面的正则表达式所示, “无连续句点”“@ 之前或之后没有句点”.条件是由只能出现在 2 个非点字符之间的事实强制执行的。

我不完全了解电子邮件规范,因此即使它满足问题中的条件,我也不能保证该电子邮件根据 specs 是有效的


域部分{1}字符类内部有相同的问题。

我冒昧地使用对hostname的限制,其中标签不得以 . 开头或结尾-

[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)*

如果您想强制执行 TLD:

[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)

i请注意,我使用带有标志的非捕获组使 TLD 不区分大小写。

于 2013-08-27T15:46:45.730 回答
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)$)|^$

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

于 2013-08-27T15:50:09.083 回答