[code="java"]
System.out.println("111".matches("(\d)((?!\1)\d)\3"));
输出false
System.out.println("111".matches("((\d)((?!\1)\d)\3)"));
怎么会是true
[/code]
因为前一个正则表达式里,匹配到(?!\1)的时候,第一个捕获分组((\d))已经匹配到内容了,内容是1,而这里的否定正向环视要求这个位置的右边不是1,所以不匹配。
后一个正则表达式里,匹配到(?!\1)的时候,第一个捕获分组尚未匹配完因而内容还是空的,这样这个否定正向环视就不影响后续匹配,最后整个正则表达式就匹配了。