2011-01-22 55 views
15

我正在寻找一个正则表达式验证电子邮件,了解它是否合法或不..我有以下几点:轨道 - 正则表达式验证电子邮件

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 

问题与上面是[email protected]没有返回当它应该是有效的。任何想法或建议更好的正则表达式?

感谢

+2

我认为下划线问题只是其中的一个,上面的失败会产生误报或负面影响。你真的*需要*验证超越“包含@ @”字符吗?线程[“什么是验证电子邮件地址的最佳正则表达式?”](http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses)包含更多细节。 – jensgram 2011-01-22 19:48:49

+0

[Ruby电子邮件检查(RFC 2822)]的可能的重复(http://stackoverflow.com/questions/535600/ruby-email-check-rfc-2822) – kiamlaluno 2013-06-05 02:33:40

回答

11

我在此拍摄(见注释,上面的链接):

^[email protected]+$ 
+17

或其等效/ @/ – noodl 2011-01-22 19:56:11

+0

@noodl是否具体的Ruby?我从来没有见过`/`字符在正则表达式中有任何意义。 – jensgram 2011-01-22 20:00:40

+1

是的,在Ruby和Perl中,正则表达式默认使用`/`。相当于“裸”的正则表达式就是`@` – noodl 2011-01-22 20:02:50

2

下面是我一直在使用了一段时间的电子邮件正则表达式:

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

这是一个从here

+2

我只是在队列中为Mblake的响应显示相同的编辑资源。但是,对于Ruby来验证,您需要: /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[AZ]{2,4} $/i – 2011-10-27 19:19:24

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

这是我用它来验证电子邮件。

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

+8

不要这样做。这个正则表达式将失败格式的电子邮件,[email protected]。 +东西适用于电子邮件,是许多人和许多应用程序的电子邮件的重要组成部分。而不是重复所有的大小写匹配器,只是使整个事件不区分大小写。 – eagspoo 2012-11-16 04:06:05

+0

[email protected]是一个有效的电子邮件地址。 +亚马逊是地址[email protected]的标签。 [更多电子邮件地址标签信息](http://www.stevejenkins.com/blog/2011/03/how-to-use-address-tagging-usertagexample-com-with-postfix) – ali 2015-05-04 15:14:23

25
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][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6})$/i 

不要问我解释了吧!这是来自验证插件,因为我所需要的只是电子邮件正则表达式,所以我失去了跟踪。

+0

这个正则表达式将空字符串标识为有效电子邮件。您应该省略第二个字符中的外部圆括号和管道,这是接受空字符串`/ ^(([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` – 2013-06-26 21:24:05

+4

这应该和`validates_presence_of :email`,这样他们就会在空的时候得到正确的错误信息。 – scragz 2013-06-27 03:09:02

+0

这会对像`.international`这样的新顶级域名失败。 – 2017-01-24 10:23:45

1

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

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

不知道多少会帮助你,但为我工作得很好。

如果有人发现它没有任何电子邮件地址,请回复我,以便我能够在这方面做更多工作。

-1

这是我们使用的。

我们假设它是“某物”@“某物”。 “某事”(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})(\]?)$/ 
11

@ jensgram的回答非常好,但它实际上仍然允许没有域的电子邮件,例如, foo @ bar与[email protected]一样有效。

这是一个需要string @ string的细微变化。字符串:

/\A\[email protected]+\.\S+\z/

,或者更可读(虽然不需要括号):

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

Play around with this

*注:这个表达式是要好上很多,更复杂的,因为电子邮件被允许有多么令人难以置信的多样性。从技术上讲,如果用引号包裹电子邮件,甚至可以使用空格,例如“这是一个有效的电子邮件地址” @ email.com

*编辑:我已经取代了^$\A\z防止轨道测试一个多锚错误。

*编辑:感谢@Barry注意到正则表达式允许使用空格。使用\ S更新正则表达式,以防止带有不正确空格的电子邮件。 [email protected]是一个可接受的地址,因此仍然允许多点。

1

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

它声称,有在任一的localpart或域中没有@符号或空格,并且有一个单一的@符号分隔的localpart和域。

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

由于正在创造更多的顶级域名,这是前瞻性的思维。

这是从Devise ,认证的行业标准。

5

这些其他答案中的大多数都太严格,或者允许地址显然是错误的。所以最好放弃过于严格,这会让用户感到沮丧,并把主要事情做好。

1.最常见的用例:

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

2.还允许[email protected][email protected],使用:

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

的上述无替换寻找CAPTCHA,DNS记录,DNS域名黑名单,IP黑名单和确认电子邮件。

对于真实的电子邮件域验证,这可以用来代替:https://gist.github.com/9200104

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

-1

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

此方法检查返回的nil作为在这样的语言环境中失败的电子邮件验证标志:

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

这将通过电子邮件喜欢[email protected]ā[email protected]ājās.lv,以验证电子邮件[email protected]_domain.org

1

最好的方法&密码导轨:

class User < ActiveRecord::Base 
    attr_accessor :password 
    EMAIL_REGEX = /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i 
    validates :username, :presence => true, :uniqueness => true, :length => { :in => 3..20 } 
    validates :email, :presence => true, :uniqueness => true, :format => EMAIL_REGEX 
    validates :password, :confirmation => true #password_confirmation attr 
    validates_length_of :password, :in => 6..20, :on => :create 

    before_save :encrypt_password 
    after_save :clear_password 
    def encrypt_password 
    if password.present? 
     self.salt = BCrypt::Engine.generate_salt 
     self.encrypted_password= BCrypt::Engine.hash_secret(password, salt) 
    end 
    end 
    def clear_password 
    self.password = nil 
    end 
end 

宝石使用加密密码

gem 'bcrypt', :require => 'bcrypt' 
0
validates :email, presence: true ,format: { with: /\A([\w+\-]\.?)[email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i } 
6

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

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

相关问题