【问题标题】:Regex for email not accepting more than one dot or apostrophe电子邮件的正则表达式不接受多个点或撇号
【发布时间】:2014-05-29 09:57:59
【问题描述】:

我知道关于正则表达式喜欢 using a regular expression to validate an email addressregular expression to match single dot but not two dots 有成千上万个问题。

我创建了一个如下的正则表达式,它接受'(撇号)和.(点)。

/^[\w-\.\']{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]{2,3}$/

但它也可以接受连续的双点和连续的双撇号。如何预防?

例如:

john's.presonal@somedomain.com 是正确的。

john's..presonal@somedomain.com 不正确。

john's.presonal.email@somedomain.com 是正确的。

My Fiddle Here

我了解在需要使用 '/^([^\.]|([^\.])\.[^\.])*$/' 的超链接之前查看,但不知道如何创建我的 reg-ex!

【问题讨论】:

  • 您最好将电子邮件地址解析两次并要求它匹配两个正则表达式。否则你的正则表达式会很快陷入疯狂。
  • @ydaetskcoR:验证在服务器端,它是一个自动化框架,用于验证与之关联的Object's PropertiesValidation Reg-ex。 :(

标签: .net regex


【解决方案1】:

只需在您的 ^ 之后添加此否定前瞻

(?!.*(?:''|\.\.))

这是如何工作的?

(?!.*(?:''|\.\.)) 是一个否定的前瞻,它断言:在当前位置(即字符串的开头),我们无法匹配任何后跟两个撇号或两个点的字符。

其他调整

因为这不是问题,所以我没有分析您的正则表达式的其余部分。但是,一目了然:

  1. {1,} 可以写成+
  2. 您的初始[\w-\.\'] 表示电子邮件可以以点开头(以及其他字符)。你确定这是有效的吗?如果不是,请从允许集中的一个字符开始匹配,然后只添加量化集。
  3. 末尾的{2,3} 可以用于comus 等TLD。但是您确定要排除诸如mobi 之类的顶级域名吗?

轮子

作为参考,这里是已经发明的“轮子”的例子。这是 RegexBuddy 库中的两个电子邮件表达式。

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b

RFC2822:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

【讨论】:

  • 这是我人生中的第一个正则表达式 :) 感谢您指出这一点。将更新我的正则表达式:)。它现在有效,这对我来说很神奇。谢谢:)
  • @Idothisallday 哇,如果这是你的第一个正则表达式,那你做得很好!你很快就会成为专业人士。感谢您的反馈意见。仅供参考,从 RB 库中添加了两个正则表达式以供参考,但听起来您想做自己的事情。 :)
  • 我实际上是在regex101 中写的,这些人强调了\w match any word character [a-zA-Z0-9_]。休息一下,我在谷歌上搜索了一下:P
  • 我的最终正则表达式是你建议的/^(?!.*(?:''|\.\.))[\w-\.\']+\@([\da-zA-Z-]{1,}\.)+[\da-zA-Z-]{2,5}$/。我已经尝试过你的建议 1 和 3。但不知道如何尝试 2。我没有得到那个工作。你能帮忙吗?这是错的吗? /^(?!.*(?:''|\.\.))[A-Z0-9._%+-]+\@([\da-zA-Z-]{1,}\.)+[\da-zA-Z-]{2,5}$/
  • 这是正确的/^(?!.*(?:''|\.\.))[A-Za-z0-9-\.\'\-\_]+\@([\da-zA-Z-]{1,}\.)+[\da-zA-Z-]{2,5}$/
【解决方案2】:

匹配每个有效电子邮件的正则表达式是very complicated

您应该在 PHP 中使用 filter_var($email, FILTER_VALIDATE_EMAIL) 或在 Objective-C 中使用 [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error]

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2015-01-05
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多