【问题标题】:RegEx Email validation issueRegEx 电子邮件验证问题
【发布时间】:2013-08-27 15:12:31
【问题描述】:

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

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

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

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

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

谢谢, 赛博

【问题讨论】:

  • 感谢所有为解决我的问题做出贡献的人。 :)

标签: java regex


【解决方案1】:

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

^[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 个非-dot 字符,如上面的正则表达式所示。

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


域部分有同样的问题与字符类中的{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 不区分大小写。

【讨论】:

  • 基于对原始问题的编辑,我认为应该删除(?=[^@]{3}),但其他一切看起来都正确。
  • @ajb:这个问题令人困惑。 “最少 3 个字符”是条件之一吗?
  • @nhahtdh 不,这不是条件之一。由于我的正则表达式不正确,至少出现了 3 个字符。最小值应为 1 个字符。
  • @Seb:我删除了断言。它应该满足您的条件。
  • @Seb:请参阅域部分的修复。您应该能够将所有内容放在一起。
【解决方案2】:

您可以试试这个(只是对您的代码稍作修改):

(^(?!.*\\.{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)$)|^$

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

【讨论】:

  • 谢谢,但我仍然需要使用此代码至少 3 个字符。
  • 这将拒绝ab_@something.com,这应该是有效的。
  • 试试ab@xyz.com、a@xyz.com、a@x.com怎么样
  • @Seb 最少三个字符在那里,因为正则表达式有一个匹配一个字符的字符类,后跟一个必须匹配至少一个字符的类,然后是另一个必须匹配的类至少一个字符。这使得三个。问题是这个正则表达式不允许在 @ 之前使用特殊字符。
  • @ajb 我明白这一点。然而,这就是我最初的查询。我不知道如何满足要求并允许 1 个或更多字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 2019-06-16
  • 2010-11-07
  • 2017-10-23
  • 1970-01-01
  • 2011-04-19
相关资源
最近更新 更多