【问题标题】:Fix Regular Expression for Emails to Not allow Consecutive Periods修复电子邮件的正则表达式以不允许连续句点
【发布时间】:2011-03-02 22:10:53
【问题描述】:

我的正则表达式很糟糕,所以我想在这方面寻求一些帮助。

我有一个正则表达式:

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

它适用于我的电子邮件验证的大多数情况,但是它允许通过:

test..testing@gmail.com

如何更改上述正则表达式以不允许在整个字符串中的任何位置出现连续句点?

谢谢。

【问题讨论】:

  • 但这是一个完全有效的电子邮件地址。
  • 作为技术专家,您的工作职责之一是确保为您提供需求的人员不会意外地在他们付钱给您的产品中设计错误。
  • @Seth:那么您需要向我们展示您的规格。您不是在验证电子邮件地址,而是在验证您的经理编造的电子邮件地址的一部分。或者更好的是,如果你的经理是个彻头彻尾的白痴,就把你的经理打得头破血流(或者温和地指出错误!)。
  • 这样想:您将向输入有效电子邮件地址的人显示什么错误消息,其中一个恰好有两个连续的句点? “无效的电子邮件地址”,当用户完全知道它不是“无效”时?
  • 哇——大家好,虽然我认为整体精神是正确的,@markijbema 在评论中指出严格的 RFC5322 地址实际上不能在左侧有连续的点地址...

标签: javascript regex validation


【解决方案1】:

为避免匹配两个连续的点,您可以在正则表达式的开头添加一个负前瞻:

/^(?!.*\.{2})[a-z0-9etc...
 ------------

如果字符串中的任何位置有两个连续的句点,并且不需要对原始正则表达式进行任何其他修改,它将无法匹配。

但这似乎是个坏主意,因为您的正则表达式一开始就不正确。如果您坚持使用正则表达式来验证电子邮件地址,请尝试以下操作:

【讨论】:

  • "将此添加到您的正则表达式中。它不需要对您的正则表达式进行任何修改。"不错
  • 但是它仍然允许在 @ 之前直接使用点(当然你也可以解决这个问题,但是结束在哪里?)
  • @markijbema:最终是要做好。请参阅我在更新中添加的链接。
  • 除了不接受某些用户电子邮件地址的道德困境之外,这个想法是为了实现 FS,这就是我所要求的。谢谢。
  • 我不同意 RFC 在实践中失败的说法。人们可能会因为注册无效的电子邮件地址而失败,然后当他们不能正常工作时他们会感到沮丧,但这是他们自己的错(或者他们的服务提供商给他们一个无效的电子邮件地址的错)。 RFC 很痛苦,但没有 RFC 的生活会更糟。最好在注册电子邮件地址时遵守 RFC,对于那些选择忽略此建议并注册并积极使用无效电子邮件地址的人 - 祝你好运!
【解决方案2】:

不要。该电子邮件地址是 functional in practice(尽管根据相关 RFC 是 technically invalid)。

重要提示:不要使用正则表达式“验证”电子邮件地址,否则会出错。

【讨论】:

  • 不,不是,你不能有连续的点。并且地址不能以点开头,也不能以点结尾。
  • @markijbema:RFC822 失败了,但在现实世界中,我可以为您制作一个带有连续点的功能性电子邮件地址。这就是验证者在实践中注定要失败的原因。
  • 哇,你是对的,这确实有效。不要到处声称它是有效,这只是令人困惑。但我收回了我的 -1,并将其转换为 +1。
  • @markijbema:很公平; “有效”在这里可能是一个令人困惑的术语。
【解决方案3】:

不要试图发明轮子;)

例如,请看这里:

http://www.regular-expressions.info/email.html

【讨论】:

    猜你喜欢
    • 2021-05-22
    • 2021-12-18
    • 2011-09-04
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多