我正在寻找一个正则表达式来验证电子邮件以了解它是否有效..我有以下内容:
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
在它应该的时候没有返回有效。有关更好的正则表达式的任何想法或建议吗?
由于
答案 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/
*注意:这个正则表达式比许多更复杂的正则表达式更好,因为允许电子邮件多么多样化。从技术上讲,如果用引号括起来,电子邮件甚至可以使用空格,例如“这是一封有效的电子邮件”@ 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/
这是我用来验证电子邮件的内容。
答案 5 :(得分:5)
这些其他答案中的大多数都限制性太强,或者允许明显错误的地址。因此,最好放弃过于严格,这会让用户感到沮丧,只是让主要事情变得正确。
<强> 1。最常见的用例:
validates :email, ..., format: { with: /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/ }
<强> 2。要同时允许root@localhost
或homer@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)
答案 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.lv
,test_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