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

时间:2011-01-22 19:44:21

标签: ruby-on-rails regex 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

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

由于

15 个答案:

答案 0 :(得分: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

不要让我解释一下!这是来自我已经失去追踪的验证插件,因为我需要的只是电子邮件正则表达式。

答案 1 :(得分:12)

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

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

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

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

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

Play around with this

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

*修改:我已将^$替换为\A\z,以防止在测试中出现多行锚定错误。

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

答案 2 :(得分:11)

我的镜头(见上面的评论和链接):

^.+@.+$

答案 3 :(得分:9)

没有足够的声誉来添加评论,但如果您要使用Devise正则表达式,并且您已经在使用Devise本身,那么您可以简单地使用:

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

答案 4 :(得分:8)

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

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

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

答案 5 :(得分:5)

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

<强> 1。最常见的用例:

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

<强> 2。要同时允许root@localhosthomer@blinky,请使用:

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

以上所有内容均未取代寻找CAPTCHA,dns记录,DNS域名黑名单,IP黑名单和确认电子邮件。

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

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

答案 6 :(得分:3)

正确格式:email@domain.com

规则:

  • 没有空格
  • 字符前缀 + @ + 域 + . + 字符后缀

简单的答案:

def validate_email(email)
  (email =~ %r{^\S+@\S+\.\S+$}xi).present?
end

示例:

'email' # false (no '@' and no domain)
'email@' # false (no domain)
'email@domain' # false (domain format without '.')
'em ail@d omain.com' # false (whitespace included)
'@domain.com' # false (no character prefix)
'email@domain.' # false (no character suffix)
'email@domain.com' # true

答案 7 :(得分:1)

这是我一直使用的电子邮件正则表达式:

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

来自here

答案 8 :(得分:1)

使用:/\A[^@\s]+@[^@\s]+\z/

  

它断言localpart或域中没有@符号或空格,并且有一个@符号分隔localpart和域。

更重要的是:需要电子邮件验证

随着更多tld的创建,这是前瞻性思维。

这来自Devise ,身份验证的行业标准。

答案 9 :(得分:1)

^.+@[\w]+\S[^\s]+$

对第一个答案的简短改进

答案 10 :(得分:0)

对于电子邮件验证,我想出了这个正则表达式,

/^[\w\d]+@[\w\d]+(\.[\w\d]+)+$/

不知道它对你有多大帮助,但对我来说工作正常。

如果有人发现任何电子邮件地址失败,请回复我,以便我能够就此工作。

答案 11 :(得分:0)

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

URI::MailTo::EMAIL_REGEXP

答案 12 :(得分:-1)

在非英语语言环境中,您可能需要验证带有重音(unicode)字符的电子邮件,例如čšēīū等。

此方法检查返回的nil,作为此类区域设置中电子邮件验证失败的标志:

def validate_unicode_email email
  /\A[\w\u00C0-\u017F\-]+(\.[\w\u00C0-\u017F\-]+)?@[\w\u00C0-\u017F\-]+\.[\w]{2,6}$/.match email
end

这会传递name.surname@gmail.comāpsis@mājās.lvtest_email@test_domain.org等电子邮件

答案 13 :(得分:-2)

这是我们使用的。

我们认为它是“某事”@“某事”。 “东西”(2-4个字符)。它应该涵盖任何“常规”电子邮件。

/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/

答案 14 :(得分:-3)

validates_format_of :email, :with => /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/i