2016-08-01 36 views
0

我使用的電子郵件驗證模式是How to validate an email,它的工作正常,但它允許在電子郵件的第一部分中使用+,並且這在我的規格中是不允許的。原始代碼是電子郵件驗證模式未封閉的字符類

public static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" 
     + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; 

protected boolean isInvalidEmail(String email) { 
    pattern = Pattern.compile(EMAIL_PATTERN); 
    matcher = pattern.matcher(email); 
    return !matcher.matches(); 
} 

我想我可能只是刪除"^[_A-Za-z0-9-\\+]+但我得到一個Pattern Syntax Exception: Unclosed Character Class。有人可以告訴我爲什麼取消+解鎖班?謝謝!

回答

2

您必須刪除\\+部分。

\\逃脫\字符。 \+轉義+正則表達式運算符。因此\\+分解爲\+這意味着匹配文字+字符。

注意:+正則表達式運算符意味着匹配一個或多個前面的元素。

+0

這很奇怪,他們把'\\ +'放在最後的'-'後面,不是嗎? '-'只在字符類的開始或結尾處有其字面表示,否則作爲範圍運算符。所以這個正則表達式的來源似乎是不可信的。 –

+0

@AndrewCheong我認爲這很奇怪,但[前5名正則表達式測試人員](https://www.google.com/search?client=ubuntu&channel=fs&q=java+regex+tester&ie=utf-8&oe=utf- 8)不顯示任何錯誤,並且它匹配有效的字符串,例如'example- @ email.com'。雖然,如果連字符不在開頭或結尾,那麼它應該被轉義('\ -')。 –

2

它爲您提供Unclosed Character Class的原因是因爲現在只有刪除+纔會轉義方括號,因此它被認爲是模式的一部分。因此,班級沒有匹配的方括號。正如Jonny Henly提到的解決方案是刪除\\+以符合您的規範,但這給出了答案,爲什麼它沒有關閉。

+0

*這給出了答案,爲什麼它沒有關閉* - +1 –