0

有谁知道 Pattern API 在哪里描述了这行代码的行为

System.out.println("000".matches("(0)\\10"));

我认为在运行它之前很少有人能说出它打印的内容。API 说

\n Whatever the n-th capturing group matched

它并没有说 n 必须是 1 位数字。在我的测试中是第 10 组还是第 1 组?

4

2 回答 2

3

您尝试匹配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

于 2012-12-11T07:57:25.753 回答
0

这种情况下的行为在Pattern api 的与 Perl 5 的比较部分中进行了描述:

在 Perl 中,\1 到 \9 总是被解释为反向引用;如果至少存在那么多子表达式,则将大于 9 的反斜杠转义数字视为反向引用,否则如果可能,将其解释为八进制转义。在此类中,八进制转义必须始终以零开头。在这个类中,\1 到 \9 总是被解释为反向引用,如果在正则表达式中的那个点至少存在那么多子表达式,则接受一个较大的数字作为反向引用,否则解析器将删除数字直到数字小于或等于现有组数或为一位数。

于 2012-12-14T13:53:27.860 回答