2014-02-05 103 views
0

我有一個字符串,如com.sap.fw.tr.SYSTEM.GKBN,其中GKBN是可變的,而其餘部分是固定的。我用正則表達式匹配以constatant開頭的字符串

Pattern p = Pattern.compile("^com.sap.fw.tr.SYSTEM.([a-z]*)$"); 

,但是當我打電話Matcher.matches();它返回false。 有人可以指出這個正則表達式中的錯誤嗎?

+0

改爲使用'[A-Z]'。 – 2014-02-05 11:32:52

+0

它也可以是數字? – Amitesh

回答

0

您正在匹配大小寫輸入與[a-z]*,它們只會匹配小寫字母。

使用此

^com\\.sap\\.fw\\.tr\\.SYSTEM\\.([A-Z]*) 

我在regexplanet.com測試這一點。有效!如果你想讓大小寫不敏感。您可以使用?i忽略大小寫匹配。

2

您正在匹配一個大寫字母輸入,並且只有[a-z]*纔會匹配小寫字母。

試試這個:

Pattern p = Pattern.compile("(?i)^com\\.sap\\.fw\\.tr\\.SYSTEM\\.([a-z]*)$"); 

OR這樣的:

Pattern p = Pattern.compile("^com\\.sap\\.fw\\.tr\\.SYSTEM\\.([a-z]*)$", 
        Pattern.CASE_INSENSITIVE); 

(?i)用於忽略大小寫匹配

0

嘗試使用:

("^com\\.sap\\.fw\\.tr\\.SYSTEM\\.([A-Z]+)$"); 

它僅使用大寫萊特一個或多個。和更好的逃生.符號與\.

+0

不會編譯。使用\\ –

+0

我認爲一個'\\'符號就夠了,不是嗎? –

+0

不,'\\'符號也必須被轉義。在發佈答案之前,先自己嘗試一下。 :-) –

0

這是最堅硬的解決方案,如果你想匹配一個有效的Java標識符:

inputString.matches("\\Qcom.sap.fw.tr.SYSTEM.\\E\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*"); 

這使用String.matches(String regex),而不是通過Pattern類去。

打破格局的下降:

\Qcom.sap.fw.tr.SYSTEM.\E  # Match literal string "com.sap.fw.tr.SYSTEM." 
\p{javaJavaIdentifierStart} # Match 1 - starting character of a Java identifier 
\p{javaJavaIdentifierPart}* # Match 0 or more - part characters of a Java identifier 

這種模式利用java.lang.Character類的功能,在這裏你的java.lang.Character類中的方法名稱前面前面加上java

上面的正則表達式根據Character.isJavaIdentifierStartCharacter.isJavaIdentifierPart方法檢查字符。

相關問題