2014-03-04 51 views
1

我在寫一個簡單的小應用程序,它允許我共享信息。我有一個使用regx驗證電子郵件地址的問題。 我很親切的學習。但是,當涉及到真實世界的例子時,例如可以用正則表達式驗證的字符串,我很困惑。使用正則表達式進行電子郵件地址驗證

練習: 解開下面的正則表達式驗證電子郵件地址:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])? 

它看起來像字符的混亂。

有人請向我解釋這是如何工作的?

我嘗試使用這個在線資源由Jan Goyvaerts. 任何幫助,我將不勝感激。

+0

電子郵件正則表達式很複雜,你必須從容易的人開始理解。請注意,這是[複製](http://stackoverflow.com/a/201378/151019),它很複雜,可能沒有。 – Mark

+0

兩個問題:1. RegEx並不容易。 2.轉義特殊字符很混亂。 3.電子郵件地址很複雜。結合三件事情,她真的很混亂 – zaph

+0

看到http://stackoverflow.com/questions/12448918/regex-email-address-validation?rq=1 – Mark

回答

0

兩個建議我有你。

  1. 轉義特殊字符是混亂的。 2.電子郵件地址很複雜。如果你真的感興趣,我可能會推薦你學習這篇文章。請查看其他帖子:Validation in RegexRegex Help
2

我發現一個顯着的工具,在這裏可視化的正則表達式:http://regexper.com

這讓我發現,你的正則表達式打破了這個樣子。希望這有助於解釋它。

enter image description here

+0

嘗試https://www.debuggex.com/它也很酷。他們在StackOverflow_按鈕上有一個_ Embed。 –

+0

我喜歡那樣,但我不喜歡它是如何水平爆炸的。我有一臺30英寸的顯示器,結果甚至都不合適。 – StilesCrisis

0

看到這個answer。這個問題可能太難解決了。你在這裏遇到兩個問題。 1. RegEx並不容易。 2.轉義特殊字符很混亂。最後,電子郵件地址很複雜。如果你真的感興趣,我可能會推薦你學習這篇文章。

3

正則表達式可能是一個有趣但棘手的問題。這個陳述有5個部分。

一個用戶名

[a-z0-9!#$%&'*+/=?^_`{|}~-]+ 

檢查單個有效字符 ''和字符的任何附加量

(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)* 

的 '@' 符號

有效的第二/較低級域

(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+ 

有效頂級域

[a-z0-9](?:[a-z0-9-]*[a-z0-9])? 

我推薦http://www.ultrapico.com/expresso.htm 。它會打破你的聲明。

1
  1. [a-z0-9!#$%&'*+/=?^_`{|}~-]+
    這看起來對這裏給出的字符中的至少一個(A-Z,0-9,和這些特殊字符)。
  2. (?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)
    這看起來和上面一樣,但只有當它站在一個點後面時。這部分是可選的,可以無限重複。它防止名稱末尾的點。
  3. @
    匹配@符號
  4. (?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+
    這符合a-z0-9在以點結束,中間點和可選-結束。這必須至少匹配一次。
  5. [a-z0-9](?:[a-z0-9-]*[a-z0-9])?
    這看起來對a-z0-9,任選隨後a-z0-9-,但它不能用-再次結束。
4

首先,有關於完全一樣的東西了良好的線程: Using a regular expression to validate an email address

然後,下面有你的正則表達式的解釋:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+ 

- 方括號表示符號類,包含方括號中的所有符號。加號('+')是一個量詞,這意味着由該符號類表示的符號序列必須至少有一個字符長。

此外,'+'是貪婪,因此,這部分模式將匹配最大可能長度的符號序列。在說到方括號內容時,'a-z'表示範圍內的任何符號,其可以在數學上被描述爲[a,z],並且'0-9'是相似的。在這種情況下,所有其他符號都只是符號。

(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)* 

- 在正則表達式中,括號表示分組,星號(「*」)是一個貪婪量詞,意思是「出現零或更多次」。所以我們不確定我們是否會找到括號內容,但我們不排除這種可能性。

然後,在括號內,我們看到了?:字符組合,它放在括號內告訴我們內部的符號組不應該被捕獲爲子字符串以供進一步參考。

更進一步,\。意味着只是一個通常的點(見Escape sequence),因爲點符號是正則表達式中的元符號。

在點之後我們再次看到符號的特徵,如上所述。

@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+ 

- 在這裏,我們看到了at符號(「@」),這只是一個在這裏的符號,然後有一個非捕獲符號組,之後將發生一次或多次(因爲+的),其中包括[a-z0-9]類的單個符號和另一個非捕獲的符號組,除了問號標記('?')之外,您可以使用上述解釋完全描述哪些內容,這意味着在這種情況下(即,如果它被用作量詞)「一次或根本不」。

[a-z0-9](?:[a-z0-9-]*[a-z0-9])? 

- 這最後一部分是類似於在一個符號組發現,上面所解釋的,所以我相信你現在已經足夠的信息來了解它。

更多關於量詞類型在這裏:Greedy vs. Reluctant vs. Possessive Quantifiers

一個很好的正則表達式參考:Regular Expression Language - Quick Reference

的一些信息對正則表達式捕捉:Regex Tutorial - Parentheses for Grouping and Capturing

關於特殊字符:Regex Tutorial - Literal Characters and Special Characters

相關問題