为什么人们使用正则表达式进行电子邮件和其他复杂验证?

时间:2008-10-17 11:50:17

标签: regex validation email parsing

此处有email个正则表达式questions弹出up,我真的很困惑为什么人们使用这些insanely obtuse匹配表达式而不是非常简单将电子邮件拆分为名称和域令牌的解析器,然后针对名称允许的有效字符进行验证(无法对此部分进行进一步检查)和域的有效字符(我想你可以添加对所有世界顶级域名(TLD)的检查,然后为具有此类(即com.uk)的国家/地区添加另一级别的二级域名。

真正的问题是tlds和slds不断变化(与流行的看法相反),因此如果您计划在根名称服务器发送更改时进行所有这些高级别检查,则必须不断更新正则表达式。< / p>

为什么没有一个模块可以简单地验证从数据库或平面文件中提取的域,并可选择检查DNS是否匹配记录?

我在这里认真,为什么每个人都如此热衷于为此创造完美的正则表达式?它似乎不是解决问题的合适方法......

说服我,不仅可以在regexp中做(并满足每个人),而且它是一个比自定义解析器/验证器更好的解决方案。

- 亚当

12 个答案:

答案 0 :(得分:25)

他们这样做是因为他们看到“我想测试这个文本是否符合规范”,并立即想到“我知道,我会使用正则表达式!”没有完全理解规范的复杂性或正则表达式的局限性。正则表达式是一个用于处理各种文本匹配任务的精彩,强大的工具,但它们并不是完成所有这些任务的完美工具,似乎许多使用它们的人都忽视了这一事实。

答案 1 :(得分:8)

捕获大多数(但不是全部)常见错误的正则表达式相对容易设置和部署。编写自定义解析器需要更长的时间。

答案 2 :(得分:8)

一旦掌握了基础知识,使用RegExp的诱惑就非常大。事实上,RegExp似乎非常强大,以至于人们自然希望在任何地方开始使用它。我真的怀疑这里涉及到很多心理学,正如Randall的XKCD comic所证明的那样(是的,它 很有用)。

我曾经在RegExp上做过一次介绍性介绍,最重要的幻灯片警告过度使用它。这是唯一使用粗体字体的幻灯片。我相信这应该更频繁地完成。

Everybody stand back!

答案 3 :(得分:4)

使用正则表达式是一个好主意,正如其他帖子中详细说明的那样。

我想人们会继续这样做,因为他们不知道更好或不关心。

解析器会更好吗?也许,也许不是。

我认为发送验证电子邮件是验证它的最佳方式。如果你想从JavaScript检查任何东西,那么检查它是否有一个“@”符号和之前和之后的东西。如果你比那更严格,你就会遇到一些你不知道的语法,你的验证器会变得过于严格。

另外,请注意您的TLD验证方案,您可能会发现自己assuming too much关于TLD允许的内容。

答案 4 :(得分:3)

人们这样做是因为在大多数语言中,编写正则表达式比在代码中编写和使用解析器更容易(或者至少看起来如此)。

如果您决定避开正则表达式,则必须手动编写解析器,或者使用外部工具(如yacc)生成词法分析器/解析器。这比单行正则表达式匹配更复杂。

需要有一个库,可以直接用X语言编写解析器(其中'X'是C,C ++,C#,Java),以便能够像正则表达式匹配器一样轻松地构建自定义解析器。

这些库起源于功能区(Haskell和ML),但现在“解析器组合库”存在于Java,C ++,C#,Scala和其他主流语言中。

答案 5 :(得分:3)

人们使用正则表达式来处理电子邮件地址,HTML,XML等,因为:

  1. 看起来就像他们应该工作一样,他们经常为 明显的案例。
  2. 他们“知道”正则表达式。当你拥有的只是一把锤子 你的问题看起来像指甲。
  3. 编写解析器比编写常规更难(或者看起来更难) 表达。特别是,编写解析器比编写解析器更难 处理#1中明显情况的正则表达式。
  4. 他们不了解任务的完整复杂性。
  5. 他们不了解正则表达式的限制。
  6. 他们从处理明显案例的正则表达式开始,然后尝试 扩展它以处理其他人。他们被锁定在一种方法中。
  7. 他们不知道(可能)库可以做 他们的工作。

答案 6 :(得分:3)

  

然后验证那些反对的   允许名称的有效字符   (没有进一步检查可以   在这部分完成)

事实并非如此。例如,“ben..doom @ gmail.com”在名称部分中仅包含有效字符,但无效。

在没有用于电子邮件验证的库的语言中,我通常使用正则表达式,因为

  1. 我知道正则表达式,并且发现它很容易使用
  2. 我有很多知道正则表达式的朋友,我可以和
  3. 合作
  4. 对我来说代码很快,对于大多数应用来说,时间比处理器时间更贵
  5. 对于大多数电子邮件地址,它都有效。
  6. 我相信很多内置库都会使用你的方法,如果你想要涵盖所有的可能性,它确实很荒谬。但是,解析器也是如此。电子邮件地址的正式规范非常复杂。因此,我们使用足够接近的正则表达式。

答案 7 :(得分:3)

我不相信使用单个正则表达式可以完成正确的电子邮件验证(现在有一个挑战!)。其中一个问题是注释可以嵌套到本地部分和域中的任意深度。

如果您想针对RFC 5322和5321(当前标准)验证地址,那么您将需要一个程序功能来执行此操作。

幸运的是,这是一个商品问题。每个人都想要相同的结果:RFC合规性。一旦开源函数解决了这个代码,就没有必要再写这个代码了。

在此处查看一些替代方案:http://www.dominicsayers.com/isemail/

如果您知道我可以添加到头对头的其他功能,请告诉我。

答案 8 :(得分:2)

我们正在寻找一种快速查看电子邮件地址是否有效的方法,以便我们可以警告用户他们犯了错误或阻止人们轻易进入垃圾邮件。 转到邮件服务器并指责它是缓慢且不可靠的。 确保唯一真正的方法是收到确认电子邮件,但问题只是在确认过程发生之前给予用户快速响应。这就是为什么要严格遵守这一点并不重要。 无论如何,这是一个挑战,而且很有趣。

答案 9 :(得分:1)

人们编写正则表达式是因为大多数开发人员都喜欢以最“酷”和“有效”的方式解决一个简单的问题(这意味着它应该尽可能不可读)。

在Java中,有些库可以检查String是否代表电子邮件地址,而无需了解正则表达式。这些库应该可用于其他语言aswel。

像Jamie Zawinski在1997年所说:“有些人在遇到问题时会想”我知道,我会使用正则表达式。“现在他们有两个问题。”

答案 10 :(得分:1)

关于因素:理解如何编写正则表达式的人的集合远远大于理解正则语言的正式约束的人的集合。同样适用于非常规“正则表达式”。

答案 11 :(得分:-3)

当然,Regexp的使用速度要快得多,而且它们只验证RFC中指定的内容。写一个自定义解析器?什么?使用正则表达式需要10秒钟。