2011-11-09 69 views
5

我有以下方法檢查允許的字符不工作:正則表達式來檢查允許的字符在Java中

private boolean checkIfAllCharsAreValid(String test) { 
    boolean valid = false; 
    if (test.matches("^[a-zA-Z0-9,.;:-_'\\s]+$")) { 
     valid = true; 
    } 
    return valid; 
} 

但如果測試有字符-在它的比賽返回false。我必須逃脫-

+1

爲什麼你不試試逃跑? – Simon

回答

9

裏面[ ... ]-符號被特殊處理。 (你自己使用它在這個特殊的目的,你的表情,你必須a-z的開始。)

你需要躲避-字符

[a-zA-Z0-9,.;:\-_'\s] 
      ^

或把它放在最後一個(或第一)在[...]表達像

[a-zA-Z0-9,.;:_'\s-] 
       ^

一些進一步的說明:

  • 從技術上講,所有字符在空字符串中都是有效的,所以我會在表達式中將+更改爲*

  • String.matches檢查完整字符串,所以^$是多餘的。

  • 你的整個方法可以wirtten爲

    return test.matches("[a-zA-Z0-9,.;:_'\\s-]*"); 
    
+0

感謝您的解釋:) –

+0

沒問題。別客氣。 – aioobe

+0

因爲我們有'a-zA-Z0-9_'作爲字符類的一部分,它是不是簡化了使用'\ w'的東西?,也就是''[\\ w,。;:'\\ s - ] *「' – ishnid

1

你可以把-在字符組的起始,使其不被解釋爲一個字符範圍。

2

A -在包圍兩邊的字符類中是一個表示範圍的正則表達式元字符。

要在焦炭類列出文字-你逃避的焦炭類-

if (test.matches("^[a-zA-Z0-9,.;:\\-_'\\s]+$")) 
           ^^^ 

或將-在字符類的末尾:

if (test.matches("^[a-zA-Z0-9,.;:_'\\s-]+$")) 
            ^

或放置- char類開頭:

if (test.matches("^[-a-zA-Z0-9,.;:_'\\s]+$")) 
        ^
相關問題