簡體   English   中英

匹配重復的字符串部分時出現奇怪的Java正則表達式錯誤

[英]Strange Java regex error when matching repeated string parts

我最近在使用Java Regular Expression時遇到了一個奇怪的錯誤:

System.out.println(Pattern.matches("(\\d\\d)", "12"));  -->  true  
System.out.println(Pattern.matches("(\\d\\d)", "11"));  -->  true  
System.out.println(Pattern.matches("(\\d\\d)\\1", "1212"));  -->  true  
System.out.println(Pattern.matches("(\\d\\d)\\1", "1122"));  -->  false  

最后一個怎么了? 任何人都可以幫助我,非常感謝〜

在第三行:

Pattern.matches("(\\d\\d)\\1", "1212")
                 +------+
                    12

捕獲的組是12.所以\\1包含12,並且從12 = 12,你得到了真。

在第四行:

Pattern.matches("(\\d\\d)\\1", "1122")
                 +------+
                    11

被捕獲的組是11.所以\\1繼續11,從11!= 22你得到假。

\\1是上一場比賽的占位符。 最后一個例子的匹配將是“11”,因此\\ 1變成“11”,這與接下來的兩個數字“22”不匹配。

我相信你把反向引用限制量詞相混淆

反向引用與先前由捕獲組匹配的文本匹配

[還有]一個額外的量詞,允許您指定令牌可以重復的次數

因此,為了匹配分組子模式的兩次出現,只需使用{2}

System.out.println(Pattern.matches("(\\d\\d){2}", "1212")); // -->  true  
System.out.println(Pattern.matches("(\\d\\d){2}", "1122")); // -->  true

請參閱IDEONE演示

或者,如果這些子模式不相鄰,則從塊動態構建模式:

String digits = "\\d\\d";
String myRegex = "\\b(?:" + digits + " word|word " + digits + ")\\b";

11 != 22 ....最后一個錯了。

\\1表示重復組。組有11 \\1期望11而不是22

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM