rails - 用于电子邮件验证的REGEX

AnA*_*ice 17 regex ruby-on-rails ruby-on-rails-3

我正在寻找一个正则表达式验证电子邮件,以了解它是否有效..我有以下内容:

def is_a_valid_email?(email)
    email_regex = %r{
      ^ # Start of string
      [0-9a-z] # First character
      [0-9a-z.+]+ # Middle characters
      [0-9a-z] # Last character
      @ # Separating @ character
      [0-9a-z] # Domain name begin
      [0-9a-z.-]+ # Domain name middle
      [0-9a-z] # Domain name end
      $ # End of string
    }xi # Case insensitive

    (email =~ email_regex)
end
Run Code Online (Sandbox Code Playgroud)

以上问题XXX_XXX@Xxx.com不应该在它应该返回时有效.有关更好的正则表达式的任何想法或建议吗?

谢谢

scr*_*agz 24

validates_format_of :email, 
  :with => /^(|(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6})$/i
Run Code Online (Sandbox Code Playgroud)

不要问我解释一下!这是一个验证插件,我已经失去了跟踪,因为我需要的只是电子邮件正则表达式.

  • 这应该与`validates_presence_of:email`一起使用,这样当它为空时它们会收到正确的错误消息. (4认同)

Sam*_*ton 12

@ jensgram的答案非常好,但它实际上仍然允许没有域名的电子邮件,例如foo @ bar与foo@bar.com一样有效.

这里有一个细微的变化,需要string@string.string:

/\A\S+@.+\.\S+\z/

或者,更具可读性(尽管不需要括号):

/\A(\S+)@(.+)\.(\S+)\z/

玩弄这个

*注意:这个正则表达式比许多更复杂的正则表达式要好,因为允许的电子邮件多么多样化.从技术上讲,如果用引号括起来,电子邮件甚至可以使用空格,例如"这是一封有效的电子邮件"@ email.com

*编辑:我已经更换了^,并$\A\z防止轨测试一个多锚错误.

*编辑:感谢@Barry注意到正则表达式允许空格.使用\ S更新了正则表达式以防止使用不正确的空格的电子邮件.仍然允许多个点,因为email@foo.bar.com是可接受的地址.


Sta*_*Kr. 12

URI 模块有一个内置的正则表达式

URI::MailTo::EMAIL_REGEXP
Run Code Online (Sandbox Code Playgroud)


jen*_*ram 11

我对此的看法(见上面的评论和链接):

^.+@.+$
Run Code Online (Sandbox Code Playgroud)

  • 或者它的等价/ @ / (17认同)
  • `@@üüü@`将被正确验证.我不知道,为什么这一点上升了.这是错的. (8认同)
  • @MegaTux严格来说,`a @ a`对于`a`作为TLD是有效的.但是,你可能是正确的,使用`@ a`作为[`local-part`](http://tools.ietf.org/html/rfc5322#section-3.4.1)(在@ @ a @ a中) `)无效. (2认同)
  • /^[^@]+@[^@]+\.[^@]+$/i.@noodl,/^.+ @.+ $ /与/ @/btw完全不相同. (2认同)

apa*_*erj 11

没有足够的声誉来添加评论但是如果你打算使用Devise regexp,并且你已经在使用Devise本身,那么你可以简单地使用:

validates :email, presence: true, format: Devise.email_regexp

  • 警告:“Devise#email_regexp”接受“test@providercom”作为有效电子邮件。 (3认同)
  • 欢迎来到堆栈溢出 (2认同)

Mbl*_*ake 8

/\b[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}\z/
Run Code Online (Sandbox Code Playgroud)

这是我用来验证电子邮件的内容.

资料来源:http://www.regular-expressions.info/email.html

  • 不要这样做.对于格式为foo+bar@dingleberry.com的电子邮件,此正则表达式将失败.+ stuff适用于电子邮件,是许多人和许多应用程序的电子邮件的重要组成部分.而不是重复所有大写和小写匹配器,只是使整个事件不区分大小写. (9认同)

小智 5

这些其他答案中的大多数限制性太强,或者允许明显错误的地址.因此,最好放弃过于严格,这会让用户感到沮丧,只是让主要事情变得正确.

1.最常见的用例:

    validates :email, ..., format: { with: /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/ }
Run Code Online (Sandbox Code Playgroud)

2.还允许root@localhosthomer@blinky使用此:

    validates :email, ..., format: { with: /\A[^@\s]+@([^@.\s]+\.)*[^@.\s]+\z/ }
Run Code Online (Sandbox Code Playgroud)

以上都不代替寻找CAPTCHA,dns记录,DNS域名黑名单,IP黑名单和确认电子邮件.

对于真正的电子邮件域验证,可以使用此代码:https://gist.github.com/9200104

这匹马现在被彻底殴打,被制成粗磨.