2014-02-21 28 views
1

我試着去驗證一個字符串,只允許字母,數字和以下字符:驗證字符串有沒有非法字符

!"#$%&'()*+,-./:;<=>[email protected][\]^_`{|}~ 

我試圖這樣做,但它不工作,讓我在正則表達式不輸入字符。我仍然很新的Java和類似的工作在JavaScript中,但我不知道這是怎麼回事。我認爲它的運行就好像它找不到任何提到的字符那麼它將返回四個字符。

Pattern allowedCharacters = Pattern.compile("[A-Za-z0-9!\"#$%&'()*+,.\\/:;<=>[email protected][\\]^_`{|}~-]+$]"); 
if (!allowedCharacters.matcher(pw).find()){ 
    return 4; 
} 

任何幫助表示讚賞。由於

編輯:

我也試過:

if (pw.matches("^[A-Za-z0-9!\"#$%&'()*+,.\\/:;<=>[email protected][\\]^_`{|}~-]+$]")){ 
     return 4; 
} 

if (!pw.matches("[A-Za-z0-9!\"#$%&'()*+,.\\/:;<=>[email protected][\\]^_`{|}~-]+$]")){ 
     return 4; 
} 
+0

您認爲這段代碼正在做什麼或應該做什麼? – Pshemo

+0

閱讀第二段。我說了我認爲它在做什麼... – Kierchon

+0

完全重複,昨天你問的同一個問題[Duplicate](http://stackoverflow.com/questions/21914179/identifying-special-non-alphanumeric-characters-in-a-string/21915172#21915172)。 – sln

回答

2

matcher.find()檢查字符串包含匹配正則表達式,所以用
!matcher.find()要檢查,如果沒有匹配的字符串進行測試的正則表達式子。

考慮使用matcher.matches()來檢查整個字符串是否與正則表達式匹配。在這種情況下,您將必須添加量詞如*,+{n,m}字符類來決定密碼長度。否則它將只有單個字符密碼。

這裏是你的代碼是如何能夠像演示

//              here you place quantifier 
//                ↓ 
if (pw.matches("[A-Za-z0-9!\"#$%&'()*+,.\\/:;<=>[email protected][\\]^_`{|}~-]+$]+")){ 
    System.out.println("password contains only valid characters"); 
} else { 
    System.out.println("invalid characters in password"); 
} 

更新:

在你的正則表達式,你不逃避 [這使得將被添加到外字符 [\]^_`{|}~-]單獨的字符類

類。此字符類將不包括\[。如果你是在只接受字母數字字符和!"#$%&'()*+,-./:;<=>[email protected][]^_`{|}~真正感興趣那麼可以考慮使用

"[\\w\\Q!\"#$%&'()*+,-./:;<=>[email protected][\\]^_`{|}~\\E]+" 

爲正則表達式。

  • \\w代表[a-zA-Z0-9_]
  • \Q\E是報價,這是機制逃跑元字符,即使在字符類。
+0

偉大的工作。我忘了+。我的理解是否正確......沒有+它只檢查第一個字符而不是整個字符串? – Kierchon

+1

種類。沒有'+'正則表達式只能接受單個字符,而不能接受它們的組,因此它只會匹配包含一個正確字符的字符串。 – Pshemo

+0

@Kierchon檢查我的更新。如果您確實只想接受字母數字值和'!「#$%&'()* +, - 。/ :; <=>?@ [\]^_ \'{|}〜'' – Pshemo

1

這是因爲你使用find()而不是matches()。也就是說,我會嘗試相反的做法,在[^<legal chars>](注意插入符號)上找到匹配非法個字符。它速度更快,因爲一旦違法,它就會失敗。另外,從簡單的合法角色開始,然後從那裏向上移動。正則表達式可能難以閱讀,並且一次添加一個具有特殊含義的字符比一次添加它們更容易。

+0

我試過了,沒有運氣。查看我的編輯,看看我做了什麼。 – Kierchon

0

使用這個問題的其他答案,我發現這對我有用。\ Q和\ E之間無需轉義。他們爲你做。

Pattern whitelist = Pattern.compile("^[\\w\\s\\Q!\"#$%&'()*+,-.\\/:;<=>[email protected][]^_`{|}~\\E]+$"); 

if (!whitelist.matcher(pw).matches()) { 
    // error 
}