使用regex进行Ruby电子邮件验证

使用regex进行Ruby电子邮件验证,ruby,regex,validation,email,Ruby,Regex,Validation,Email,我有一大堆我正在浏览的电子邮件。很多电子邮件都有打字错误。我试图建立一个字符串,将检查有效的电子邮件 这是我为regex准备的 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

我有一大堆我正在浏览的电子邮件。很多电子邮件都有打字错误。我试图建立一个字符串,将检查有效的电子邮件

这是我为regex准备的

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
你好_1@email.com#TL;博士:
归功于@joshuahunter(下面是他的答案)。包括在这里,让人们看到它

URI::MailTo::EMAIL_REGEXP
老TL;博士 原始答案 你似乎把事情复杂化了很多,我只想用:

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

由于这不符合您的dot要求,因此可以简单地如下所示:

VALID_EMAIL_REGEX = /\A([\w+\-]\.?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
正如CAustin所提到的,还有许多其他解决方案

编辑:

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

这里有一篇很棒的文章,解释了为什么你能找到的每一个验证电子邮件地址的正则表达式都是错误的,包括上面Mike发布的那些

从文章中:

本地字符串(电子邮件地址中位于 @)可以包含以下字符:

    `! $ & * - = ` ^ | ~ # % ' + / ? _ { }` 
但是你猜怎么着?你可以用 几乎任何你想要的角色,如果你通过包围它来逃避它 引用。例如,“看看所有这些空间!”@example.com是一个 有效的电子邮件地址。很好


如果你需要做一个基本的检查,最好的正则表达式就是
/@/

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

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

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

这一个更短更安全:

/\A[^@\s]+@[^@\s]+\z/
规则用于设计宝石。 但它在这些价值观方面存在一些漏洞:

  ".....@a....",
  "david.gilbertson@SOME+THING-ODD!!.com",
  "a.b@example,com",
  "a.b@example,co.de"
我更喜欢使用ruby库中的regexp
URI::MailTo::EMAIL\u regexp

电子邮件验证有一个gem


这对我来说很好:

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

现在Ruby在其标准库中提供了电子邮件验证regexp。您可以在
URI::MailTo
模块中找到它,它是
URI::MailTo::EMAIL\u 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/

但是我只使用常数本身。

你的常数确实很复杂

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
上面的代码应该足够了

为澄清起见,对上述表达的每一部分进行解释:

正则表达式的开始:

/
/
匹配字符串的开头:

\A
\z
至少一个单词字符、加号、连字符或点:

[\w+\-.]+
字面上的“at符号”:

文字点:

\.
至少一封信:

[a-z]+
匹配字符串的结尾:

\A
\z
正则表达式结束:

/
/
不区分大小写:

i
把它重新组合起来:

/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
检查一下,以便在编写表达式时方便地测试它们。

试试这个

仅选择电子邮件字符串

"Robert Donhan" <bob@email.com>sadfadf
Robert Donhan <bob@email.com>
"Robert Donhan" abc.bob@email.comasdfadf
Robert Donhan bob@email.comadfd
“罗伯特·唐汉”sadfafafafaf
罗伯特·唐汉
罗伯特·唐汉abc。bob@email.comasdfadf
罗伯特·唐汉bob@email.comadfd

至少从2.2.1开始,它就被内置到标准库中

URI::MailTo::EMAIL_REGEXP

用于创建正则表达式的引用可能重复。如何为
电子邮件\u字段添加此验证?目前,它只检查是否存在
@
。我希望它也验证是否存在
。@ssha您所说的
电子邮件\u字段
是什么意思?此正则表达式检查电子邮件是否为
内容_valid@somewhere.tld
,(请参阅正则表达式第二部分中的
\.
部分。)@MikeH-R hmmm,该正则表达式(Michael Hartl的)返回的值仅对
@
有效。这是一封有效的电子邮件吗?@Mohamad regex不应该只匹配
@
(尽管下面的约翰·卡尼(John Carney)可能会提出这样的论点,那会使电子邮件更准确地匹配)。具有
+
的所有组都需要一个或多个匹配项。例如,开头的
[\w+\-.]+
将匹配
a
aaaa
a+b.
,但不匹配空字符串。看到了吗some@email.with-subdomain.com.match(VALID_EMAIL_REGEX)=>nilAhhh,我直到现在才看到你的答案,这是我添加到我的答案中的内容。我猜。。。即使电子邮件中几乎任何东西都可以被正确引用,但实际上99.99%的电子邮件遵循合理的标准格式,而且许多系统在收到他们不承认有效的地址(即使是有效的)时会呕吐。如果你有这样一个组件,那么确保电子邮件地址既合理又有效是很重要的——特别是如果它是旧系统的一部分或是无法更改/更新的东西。这是公平的,但如果你的电子邮件地址中有空间或金钱,我不在乎你是否不能使用我的系统。我怀疑你做这件事的时候知道自己在做什么。谢谢你让我指向
URI::MailTo::EMAIL\u REGEXP
!感觉是最好的方法,因为这可能比在代码库中的某个地方转储自定义regexp更好。
/\a[^@\s]+@[^@\s]+\z/.match("这是3年前写的,如果我记得的话,我仍然在使用Ruby1.9。可能这就是我不知道它的原因吧?谢谢你的1行。是的,但三年后人们仍然用他们的自定义正则表达式回答。无论如何,我不打算攻击你或其他任何人。我已经改变了回答的语气gly.谢谢。在测试regexp 1小时后才发现此问题。
'aa@aaa'=~URI::MailTo::EMAIL_REGEXP
不适用于此情况。如果有句点,但后面没有任何内容,则正则表达式将返回nil。如果句点之后有内容或没有句点,则它将通过。“这一要求是故意违反RFC 5322的,RFC 5322为电子邮件地址定义了一种语法,该语法同时太严格(在“@”字符之前)、太模糊(在“@”字符之后)和太松散(允许以大多数用户不熟悉的方式使用注释、空白字符和带引号的字符串)