2011-01-22 53 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

相關問題