【发布时间】:2011-11-29 04:43:16
【问题描述】:
最近,我开始在我的 Rails 模型中使用来自 JQuery validation 插件的电子邮件验证正则表达式。
EMAIL_REGEXP=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i
"aaaaa.bbbbbb.ccccc.ddddd@gmail.com".match EMAIL_REGEXP # returns immidiately
"aaaaa.bbbbbb.ccccc.ddddd@gmail".match EMAIL_REGEXP # takes a long time
当一封无效的电子邮件有很多点分隔的标记(例如:first.middle.last@gmail)时,正则表达式需要很长时间。相同的表达式 works without JavaScript 中的任何明显延迟。
为什么 Ruby 和 JavaScript 正则表达式解析器的性能会有如此大的差异?有什么办法可以缩短响应时间吗?
我正在使用 Ruby 1.8.7。我在 Ruby 1.9.2 上没有看到同样的问题。
注意
我知道正则表达式很长。由于它是jQuery使用的,所以我想到了使用它。我总是可以将它改回更简单的正则表达式,如here 所示。我的问题主要是关于找出为什么相同的正则表达式在 JS 中要快得多的原因。
参考:
【问题讨论】:
-
这是一个巨大的正则表达式。为什么不使用电子邮件解析器?
-
@Blender 如果您提供链接,评论质量会大大提高
-
这个正则表达式取自官方
jQuery插件,被广泛使用。所以我认为这是一条安全的路线。如果我不能让 RegExp 工作,我可能会走自定义验证的路线。 -
另一个好问题是,您想通过匹配电子邮件地址来完成什么?你无法证明它是否有效;因为即使模式匹配,地址也可能不存在。测试电子邮件是否有效的公认方法是向该地址发送消息要求回复,然后查看是否收到回复。见stackoverflow.com/q/1910340/128421
-
哪个 ruby 版本? 1.9 处理正则表达式与 1.8 非常不同
标签: javascript ruby-on-rails ruby regex