2013-09-26 25 views
1

我正在寫一個Pattern匹配由4個大寫字母組成的String這種模式有什麼問題:Pattern.compile(「\ p {Upper} {4}」)

例如:

  • 「AAAA」
  • 「ABCD」
  • 「ZZZZ」

...都是正確的匹配,而:

  • 「1DFG」
  • 「!@#$」
  • 「1234」

...應該匹配。

在下面找到我的代碼。

它一直在「AAAA」上返回false

任何人都可以對此有所瞭解嗎?

public static boolean checkSettings(String str) { 
    Pattern p = Pattern.compile("\\p{Upper}{4}"); 
    Matcher m = p.matcher("%str".format(str)); 
    if (m.matches()) { 
     return true; 
    } else { 
     // System.exit(1) 
     return false; 
    } 
} 
+0

你應該使用[AZ] {4} – Marc

+1

@Mark這不會有什麼區別 –

+0

這非常可疑:''%str「.format(str)''format'方法是靜態的,所以' %str'字符串被忽略。第一個參數(這裏是「str」)是格式字​​符串,所以如果傳入的字符串包含任何格式化符號,則您的方法將崩潰。 – Joni

回答

4

我覺得有什麼不對您Pattern,可能壞事你輸入String

藉此例如:

Pattern p = Pattern.compile("\\p{Upper}{4}"); 
Matcher m = p.matcher("%str".format("AAAA")); 
System.out.println(m.find()); 

輸出:

true 

警告

\\p{Upper}{4}\\P{Upper}{4}相同Pattern,而是一個彼此的相對。

第二個實例否定4個大寫字符(請參閱大寫字母「P」)。我指出了這一點,因爲你的問題標題顯示錯誤Pattern

最後說明

如果你只打算使用ASCII字母字符爲您Pattern,您可能需要使用[A-Z](大寫這裏重要的),因爲其他人在這個線程提及。這與\\p{Upper}完全相同。

\\p{Lu}略有不同,它與Unicode category的大寫字母匹配。

+0

同意。 '\ p {Upper} {4}'對我來說看起來很合適,而且實際上在我的測試中有效。 –

+0

非常感謝matthew和mena!非常感謝! –

+0

@InnWu不客氣:) – Mena

0

改變你的模式:

Pattern p = Pattern.compile("[A-Z]{4}"); 

改變您匹配到:

Matcher m = p.matcher(str); 
+0

你好zack,你介意解釋爲什麼我的表情不正確嗎?謝謝! –

+1

嗯,我不知道'\\ p {Upper}正在做什麼,但我會認爲''%str「.format(str)'其中str =」AAAA「會導致」AAAAtr「爲% s被用來替換一個字符串,所以tr會被追加。因此,您傳入的任何字符串都將使用小寫字母。 –

+0

@ ZackNewsham'「%str」.format(str)'是高度可疑的,但它不會做你說的它(「%str」是*不是*格式字符串,所以它會被忽略)。 – dasblinkenlight

0

如果你真的通過AAAA,你的代碼應該給出正確的結果如果。 你應該然而重寫代碼是這樣的:

public static boolean checkSettings(String str) { 
    Pattern p = Pattern.compile("\\p{Upper}{4}"); 
    Matcher m = p.matcher(String.format(str)); 
    return m.matches(); 
} 

甚至

public static boolean checkSettings(String str) { 
    return str.matches("\\p{Upper}{4}"); 
} 

這些樣品被廣泛等同於你的代碼。我剛測試過它,它爲AAAA返回true