我有一個字符串,如com.sap.fw.tr.SYSTEM.GKBN
,其中GKBN
是可變的,而其餘部分是固定的。我用正則表達式匹配以constatant開頭的字符串
Pattern p = Pattern.compile("^com.sap.fw.tr.SYSTEM.([a-z]*)$");
,但是當我打電話Matcher.matches();
它返回false
。 有人可以指出這個正則表達式中的錯誤嗎?
我有一個字符串,如com.sap.fw.tr.SYSTEM.GKBN
,其中GKBN
是可變的,而其餘部分是固定的。我用正則表達式匹配以constatant開頭的字符串
Pattern p = Pattern.compile("^com.sap.fw.tr.SYSTEM.([a-z]*)$");
,但是當我打電話Matcher.matches();
它返回false
。 有人可以指出這個正則表達式中的錯誤嗎?
您正在匹配大小寫輸入與[a-z]*
,它們只會匹配小寫字母。
使用此
^com\\.sap\\.fw\\.tr\\.SYSTEM\\.([A-Z]*)
我在regexplanet.com測試這一點。有效!如果你想讓大小寫不敏感。您可以使用?i
忽略大小寫匹配。
您正在匹配一個大寫字母輸入,並且只有[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)
用於忽略大小寫匹配
嘗試使用:
("^com\\.sap\\.fw\\.tr\\.SYSTEM\\.([A-Z]+)$");
它僅使用大寫萊特一個或多個。和更好的逃生.
符號與\.
不會編譯。使用\\ –
我認爲一個'\\'符號就夠了,不是嗎? –
不,'\\'符號也必須被轉義。在發佈答案之前,先自己嘗試一下。 :-) –
這是最堅硬的解決方案,如果你想匹配一個有效的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.isJavaIdentifierStart
和Character.isJavaIdentifierPart
方法檢查字符。
改爲使用'[A-Z]'。 – 2014-02-05 11:32:52
它也可以是數字? – Amitesh