【问题标题】:Problems with e-mail validation Regex on RubyRuby 中电子邮件验证正则表达式的问题
【发布时间】:2017-12-12 10:34:07
【问题描述】:

我刚刚开始学习如何使用正则表达式,我正在尝试创建一个正则表达式来验证 Ruby 中的电子邮件地址。这是我到目前为止得到的:

emailregex = /([a-zA-Z]+([_\-.][a-zA-Z]*)*@\D+[.]\D+)/
str = "abc_def@hotmail.com"
puts str.scan emailregex

预期输出:

abc_def@hotmail.com

实际输出:

abc_def@hotmail.com
_def

我看过一些电子邮件正则表达式验证,但我想知道我的正则表达式有什么问题。感谢您的建议。

【问题讨论】:

  • 您可以使用w3.org/TR/html5/forms.html#valid-e-mail-address 的第一道防线过滤正则表达式,即^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$,然后发送验证电子邮件。

标签: ruby-on-rails ruby regex email


【解决方案1】:

应该归咎于 String#scan 而不是 Regexp。检查:

str = "abc_def@hotmail.com"
str.scan /\w+/
#⇒ ["abc_def", "hotmail", "com"]

你可能想要例如使用String#[]:

str[emailregex]
#⇒ "abc_def@hotmail.com"

但请不要使用正则表达式来匹配电子邮件和here is why。您的基于正则表达式的验证迟早会失败。要验证电子邮件只需检查字符串中的@ 并将验证电子邮件发送到那里。这是验证电子邮件的唯一有效的现代方法。

【讨论】:

    【解决方案2】:

    如果至少 1 个捕获组 (...) 在正则表达式中,则扫描将仅输出捕获组。

    该正则表达式有 2 个捕获组,_def 是内部捕获组的最后一次出现。
    您可以将内部设置为非捕获组 (?:...) 以避免这种情况。

    例如:

    str = "emails : abc_def@hotmail.com x_y_z@hotmail.com" 
    emailregex = /([a-zA-Z]+(?:[_.-][a-zA-Z]*)*@\S+[.]\S+)/ 
    puts str.scan emailregex
    

    输出:

    abc_def@hotmail.com
    x_y_z@hotmail.com
    

    顺便说一句,扫描对于根据模式从文本中获取匹配数组很有用。
    但是要根据模式实际验证字符串?还有另一种方法。

    例子:

    emailregex = /^[a-z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i
    
    puts ("Papa.Smurf@smurfs.town" =~ emailregex ? true : false)
    
    puts ("Joda.says:email.is.not" =~ emailregex ? true : false)
    

    【讨论】:

    • 值得一提的是String#scan总是返回一个数组,即使puts只输出一个字符串。
    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2012-10-03
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多