我刚刚开始学习如何使用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
我已经看过一些电子邮件正则表达式验证,但我想知道我的正则表达式有什么问题。谢谢你的建议。
答案 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)