繁体   English   中英

Ruby上的电子邮件验证正则表达式问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM