[英]Unexpected results when using java regex Matcher
我的測試程序中的正則表達式模式是:
"^#\\{\\S+\\}(:\\$\\{(\\d)\\})+$"
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexPatternTest2 {
public static void main(String[] args) {
String line1 = "#{aaa0}:${a22}:${10}";
String line2 = "#{aaa0}:${0}:${1}";
String line3 = "#{aaa0}:${a22}:${0}";
check(line1);
check(line2);
check(line3);
}
public static void check(String line) {
System.out.println("========================" + line);
String keyPattern = "^#\\{\\S+\\}(:\\$\\{(\\d)\\})+$";
Pattern r1 = Pattern.compile(keyPattern);
Matcher m1 = r1.matcher(line);
if(m1.matches()) {
System.out.println("match line!");
} else {
System.out.println("error! can not match line: " + line);
}
}
}
我得到以下輸出:
========================#{aaa0}:${a22}:${10}
error! can not match line: #{aaa0}:${a22}:${10}
========================#{aaa0}:${0}:${1}
match line!
========================#{aaa0}:${a22}:${0}
match line!
我希望Pattern
匹配String
變量line2
中的序列,但line3
的測試結果讓我感到困惑。
問題是\\S
會在回饋之前先吞下所有東西。
在您的第二個示例中,第一部分真正匹配#{aaa0}:${0}
,而不是您懷疑的#{aaa0}
。
因此,有理由認為第三行也匹配(第一部分匹配#{aaa0}:${a22}
)......你必須用更精確的東西替換你的\\S
(也許[^}]
?) .
如果要匹配多個數字,則需要在\\d
之后添加 + 量詞:
\\d+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.