[英]Problems with e-mail validation Regex on Ruby
我刚刚开始学习如何使用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
我已经看过一些电子邮件正则表达式验证,但是我想知道我的正则表达式有什么问题。 感谢您的建议。
应该是String#scan
而不是Regexp
。 校验:
str = "abc_def@hotmail.com"
str.scan /\w+/
#⇒ ["abc_def", "hotmail", "com"]
您可能想例如使用String#[]
:
str[emailregex]
#⇒ "abc_def@hotmail.com"
但是请不要使用正则表达式来匹配电子邮件, 这就是原因 。 您基于正则表达式的验证迟早会失败。 要验证电子邮件, 只需在字符串中检查@
在其中发送验证电子邮件 。 这是验证电子邮件的唯一有效的现代方法。
如果正则表达式中至少有一个捕获组(...),则scan将仅输出捕获组。
该正则表达式具有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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.