使用正则表达式进行Ruby Email验证

时间:2014-04-10 16:18:18

标签: ruby regex validation email

我有一大堆我正在浏览的电子邮件。很多电子邮件都有拼写错误。我正在尝试构建一个检查有效电子邮件的字符串。

这就是我对正则表达式的看法。

def is_a_valid_email?(email)
  (email =~ /^(([A-Za-z0-9]*\.+*_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\+)|([A-Za-z0-9]+\+))*[A-Z‌​a-z0-9]+@{1}((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,4}$/i)
end

如果电子邮件显示为下划线且只有一个句点,则会通过。我有很多电子邮件,名称本身有一个以上的句号。我如何在正则表达式中检查它。

hello.me_1@email.com # <~~ valid
foo.bar#gmail.co.uk # <~~~ not valid
f.o.o.b.a.r@gmail.com # <~~~valid 
f...bar@gmail.com # <~~ not valid 
get_at_m.e@gmail  #<~~ valid

有人可以帮我改写我的正则表达式吗?

9 个答案:

答案 0 :(得分:80)

TL; DR:

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

原始答案

你似乎很复杂,我只会使用:

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i

取自michael hartl's rails book

由于这不符合您的点数要求,因此可以简单地进行修改:

VALID_EMAIL_REGEX = /\A([\w+\-]\.?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i

正如CAustin所提到的,还有许多其他解决方案。

编辑:

@installero指出,原始版本对于带有连字符的子域名失败,此版本将起作用(不确定为什么字符类首先缺少数字和连字符)。

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

答案 1 :(得分:28)

这已经内置到标准库中,因为至少2.2.1

URI::MailTo::EMAIL_REGEXP

答案 2 :(得分:24)

这里有一篇很棒的文章,David Celis解释了为什么每个可以找到的用于验证电子邮件地址的正则表达式都是错误的,包括Mike发布的上述表达式。

来自文章:

  

本地字符串(电子邮件地址前面的部分)   @)可以包含以下字符:

    `! $ & * - = ` ^ | ~ # % ' + / ? _ { }` 
     但是猜猜怎么着?您可以使用   几乎任何你想要的角色,如果你通过围绕它逃脱它   在引号中。例如,&#34;查看所有这些空格!&#34; @ example.com是一个   合法的邮件地址。好的。

如果您需要进行基本检查,最佳正则表达式只是/@/

答案 3 :(得分:17)

这个更短且更安全:

/\A[^@\s]+@[^@\s]+\z/

常规用于Devise gem。 但它对这些值有一些漏洞:

  ".....@a....",
  "david.gilbertson@SOME+THING-ODD!!.com",
  "a.b@example,com",
  "a.b@example,co.de"

我更喜欢使用ruby库URI::MailTo::EMAIL_REGEXP

中的regexp

电子邮件验证有一个宝石

Email Validator

答案 4 :(得分:11)

现在Ruby在其标准库中提供了一个电子邮件验证regexp。您可以在URI::MailTo模块中找到它,URI::MailTo::EMAIL_REGEXP。 在Ruby 2.4.1中,它评估为

/\A[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])?)*\z/

但我只是使用常数本身。

答案 5 :(得分:3)

我想可以改进本书中的示例,以匹配子域中-的电子邮件。

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

例如:

> 'some@email.with-subdomain.com' =~ VALID_EMAIL_REGEX
=> 0

答案 6 :(得分:1)

Yours is complicated indeed.

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

The above code should suffice.

Explanation of each piece of the expression above for clarification:

Start of regex:

/

Match the start of a string:

\A

At least one word character, plus, hyphen, or dot:

[\w+\-.]+

A literal "at sign":

@

A literal dot:

\.

At least one letter:

[a-z]+

Match the end of a string:

\z

End of regex:

/

Case insensitive:

i

Putting it back together again:

/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

Check out Rubular to conveniently test your expressions as you write them.

答案 7 :(得分:0)

如果您使用的是 Devise,您还可以通过以下方式使用其包含的正则表达式:

Devise.email_regexp

返回:

/\A[^@\s]+@[^@\s]+\z/

答案 8 :(得分:-1)

这对我有用:

if email.match?('[a-z0-9]+[_a-z0-9\.-]*[a-z0-9]+@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})')
      puts 'matches!'
else
      puts 'it doesn\'t match!'
end