2012-03-04 157 views
1

可能重複:
JAVA: check a string if there is a special character in it的Java:檢查字符串結尾或特殊字符開頭

我試圖創建一個方法來檢查密碼的開頭或結尾一個特殊的角色。還有一些其他的檢查,我已經設法編碼,但這似乎有點複雜。

我想我需要使用正則表達式來有效地做到這一點。我已經創建了一個方法來檢查是否有任何特殊字符,但我無法弄清楚如何修改它。

Pattern p = Pattern.compile("\\p{Punct}"); 
Matcher m = p.matcher(password); 
boolean a = m.find(); 
if (!a) 
    System.out.println("Password must contain at least one special character!"); 

按照書我讀我需要使用^和$的圖案來檢查,如果它開始或特殊字符結束。我可以只添加兩個語句到現有的模式,或者我應該如何開始解決這個問題?

編輯:

好吧,我想我得到了非正則表達式的方法工作:

for (int i = 0; i < password.length(); i++) { 
    if (SPECIAL_CHARACTERS.indexOf(password.charAt(i)) > 0) 
    specialCharSum++; 
} 
+1

http://stackoverflow.com/questions/1795402/java-check-a-string-if-there-is-a-special-character-in-it – 2012-03-04 18:34:13

回答

4

最簡單的方法將是一個或分組。

Pattern p = Pattern.compile("(^\\p{Punct})|(\\p{Punct}$)"); 
Matcher m = p.matcher(password); 
boolean a = m.find(); 
if (!a) 
    System.out.println("Password must contain at least one special character at the beginning or end!"); 
+0

雖然我可能會試圖讓這個更少如果(!passowrd.matches(...))[當然對正則表達式進行了適當的修改],則可以通過寫作而囉嗦。 – 2012-03-04 18:43:45

+0

好的 - 我對dichrit的代碼進行了最小修改。我也考慮過沿着Adam Mihalcin的charAt方法,但是海報似乎也明白這個代碼,爲什麼要改變它呢? – 2012-03-04 20:49:53

3

使用此圖案:

"^\\p{Punct}|\\p{Punct}$" 
  • ^\\p{Punct} = 「串的開始,後跟一個標點符號字符
  • | = 」或「
  • \\p{Punct}$ =」 標點字符,後面跟以字符串結尾「
5

難道你不能只使用charAt來獲得角色和indexOf來檢查角色是否是特殊的?

final String SPECIAL_CHARACTERS = "?#"; // And others 

if (SPECIAL_CHARACTERS.indexOf(password.charAt(0)) >= 0 
     || SPECIAL_CHARACTERS.indexOf(password.charAt(password.length() - 1)) >= 0) { 
    System.out.println("password begins or ends with a special character"); 
} 

我沒有異形(分析對性能的金科玉律),但我希望通過編譯時字符串常量迭代比的正則表達式生成並執行一個有限狀態自動機更快。此外,Java的正則表達式比FSA更復雜,所以我期望Java正則表達式的實現方式不同,因此比FSA更慢。

+2

這幾乎就是我現在在編輯框中鍵入的內容,但是你更快。我分享你對(ab)使用正則表達式這樣簡單的例子的想法。 – Barend 2012-03-04 18:37:48

+0

你當然可以。這取決於您是否喜歡正則表達式的簡潔性,或者如果您不熟悉正則表達式,則更喜歡使用更詳細的代碼來交換更明確的內容。如果您知道自己在做什麼,則正則表達式可能會將各種檢查壓縮爲一個簡潔的代碼行。所以這實際上是一個偏好問題 - 哪些代碼對您而言更容易理解? – 2012-03-04 18:39:24

+0

@NeilCoffey無論您是否使用正則表達式,都應該將這樣的檢查打包到方法中。在其他代碼中,檢查同樣是冗長的,因爲這是一種單一的方法調用。在這個方法裏面,其含義是明確的。 – 2012-03-04 18:43:04

相關問題