2012-10-17 31 views
0

可能重複:
Using a regular expression to validate an email address正則表達式,但不包括。在電子郵件阿迪的後綴

這是家庭作業,我已經工作了一段時間,我已經做了很多的閱讀和感覺,我已經非常熟悉一個初學者的正則表達式。

我想找到一個正則表達式來驗證/無效的電子郵件列表。有兩個地址給我帶來了問題,我無法讓他們同時驗證正確的方式。我已經經歷了十幾種適用於列表中所有其他電子郵件的不同表達式,但我無法同時獲得這兩種電子郵件。

首先,地址。

[email protected] - invalid 
[email protected] - valid 

我表達的一部分驗證

我最初開始

@.+\\.[[a-z]0-9]+ 

而且有檢查一些無效地址的第二圖案和檢查電子郵件對陣雙方模式的後綴,一個檢查其他無效性的有效性,但我的教授說他希望一切都在表達。

@[[\\w]+\\.[\\w]+]+ 

@[\\w]+\\.[\\w]+ 

我已經嘗試過寫了許多,許多不同的方式,但我敢肯定,我只是用不同的語法來表達這兩種表述。

我知道我想要它做的事,我希望它匹配字符類「字符+」。「字符+」 +

加號是至少一個的。它適用於無效類,當我只允許字符類重複一次(顯然IP不匹配),但是當我允許字符類重複它本身時,它匹配第二個時間段,即使它認爲它不是前面是一個字符。我不明白爲什麼。

我甚至嘗試用()分組所有內容並在轉義後放置{1}。並將\ w更改爲a-z並用{1,}替換+;似乎沒有什麼東西需要周圍的人物。

+0

您不能像這樣嵌套字符類;多瞭解一些關於字符類的內容,瞭解其意義,然後查看子模式。 – cmbuckley

回答

0

你需要一個負前瞻

@\w+\.(?!\.) 

http://www.regular-expressions.info/lookaround.html

測試在Perl:

Perl> $_ = '[email protected]' 
[email protected] 

Perl> print "OK\n" if /\@\w+\.(?!\.)/ 
OK 
1 

Perl> $_ = '[email protected]' 
[email protected] 

Perl> print "OK\n" if /\@\w+\.(?!\.)/ 

Perl> 
+1

我想看看他解釋一個給他的教授 – climbage

+0

不好意思,它的java,不知道有多少改變的東西,編譯但是使一切無效 – user1754700

+0

正如我們可以在這篇文章中看到http://stackoverflow.com/questions/11817249/regex-lookaround-construct-in-java-advise-on-optimization-needed需要它可以在Java中使用環視... –

0
@([\\w]+\\.)+[\\w]+ 
至少

匹配一個字符,而隨後一個 '。'。這至少重複一次,然後至少多一個單詞字符。

+0

該解決方案也有效,感謝Dallin。我曾嘗試過類似的嘗試,但我錯誤地嘗試嵌套角色類而不是使用分組......像@ [[\\ w] + \\。] + [\\ w] + ... – user1754700

0

我想你想的:「」

@[\\w]+(\\.[\\w]+)+ 

這符合一個「字」後面跟着一個或多個「單詞」序列。 (您也可以按照其他方式進行分組;例如,請參閱Dailin的答案。)

您以前在做什麼的問題是您試圖在字符類中嵌入重複內容。這沒有意義,並且沒有支持它的語法。字符類定義了一組字符並與一個字符匹配。而已。

+0

是,你對我的錯誤是正確的,謝謝你向我解釋 – user1754700

0

官方標配RFC 2822描述的語法與此正則表達式有效的電子郵件地址:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

更多實際執行RFC 2822(如果我們忽略使用雙引號和方括號中的語法),它仍然會今天實際使用中所有電子郵件地址的99.99%是:

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