有谁知道 Pattern API 在哪里描述了这行代码的行为
System.out.println("000".matches("(0)\\10
"));
我认为在运行它之前很少有人能说出它打印的内容。API 说
\n Whatever the n-th capturing group matched
它并没有说 n 必须是 1 位数字。在我的测试中是第 10 组还是第 1 组?
有谁知道 Pattern API 在哪里描述了这行代码的行为
System.out.println("000".matches("(0)\\10
"));
我认为在运行它之前很少有人能说出它打印的内容。API 说
\n Whatever the n-th capturing group matched
它并没有说 n 必须是 1 位数字。在我的测试中是第 10 组还是第 1 组?
您尝试匹配0
括号之间的字符,然后您希望前一个匹配的字符\1
也存在,然后是一个0
字符。000
确实验证了该模式,因此该match()
方法返回true
,所以它打印true
。
由于匹配器没有找到10
捕获组,它将其解释为第一个,\1
然后是字符0
。
一个更复杂的例子表明,如果匹配器发现N
捕获组 > 9 并且捕获组的可用数量足够,它也可以:
System.out.println(
"01234567891011 01120".matches(
"(0)(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11) \\1\\12\\30"
)
);
是真的,因为0
在第一个捕获组中\1
并且11
在捕获组\12
中,最后没有捕获的组号\30
,所以它被解释为反向引用\3
(即字符2
),然后是字符0
。
这种情况下的行为在Pattern api 的与 Perl 5 的比较部分中进行了描述:
在 Perl 中,\1 到 \9 总是被解释为反向引用;如果至少存在那么多子表达式,则将大于 9 的反斜杠转义数字视为反向引用,否则如果可能,将其解释为八进制转义。在此类中,八进制转义必须始终以零开头。在这个类中,\1 到 \9 总是被解释为反向引用,如果在正则表达式中的那个点至少存在那么多子表达式,则接受一个较大的数字作为反向引用,否则解析器将删除数字直到数字小于或等于现有组数或为一位数。