Ruby上的电子邮件验证Regex问题

时间:2017-07-08 04:18:50

标签: ruby-on-rails ruby regex email

我刚刚开始学习如何使用Regex,我正在尝试创建一个正则表达式来验证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

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

2 个答案:

答案 0 :(得分:2)

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。您的基于正则表达式的验证迟早会失败。要验证电子邮件,只需检查字符串中的@并在那里发送验证电子邮件。这是验证电子邮件的唯一有效的现代方式。

答案 1 :(得分:0)

如果正则表达式中至少有一个捕获组(...),

扫描将仅输出捕获组。

正则表达式有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)