0

Does anybody know where in Pattern API the behaviour of this line of code is described

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

I think few people can say what it prints until they run it. API says

\n Whatever the n-th capturing group matched

It does not say that n must be 1 digit. Is it 10-th or 1-th group in my test?

4

2 に答える 2

3

0括弧の間の文字を一致させようとして、前に一致した文字\1もそこに置き、その後に文字を続けたいとし0ます。000はそのパターンを検証し、match()メソッドは を返すtrueので、出力しtrueます。

マッチャーはキャプチャ グループを見つけられなかったため、最初のグループ、次に文字10として解釈します。\10

より複雑な例は、マッチャーが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、キャプチャグループ にあるため true です\12。最後にキャプチャ グループ番号がないため、後方参照(文字)\30として解釈され、次に文字.\320

于 2012-12-11T07:57:25.753 に答える
0

この場合の動作は、Pattern APIのセクションPerl 5 との比較で説明されています。

Perl では、\1 から \9 は常に後方参照として解釈されます。バックスラッシュでエスケープされた 9 より大きい数値は、少なくともその数の部分式が存在する場合、後方参照として扱われます。それ以外の場合は、可能であれば、8 進エスケープとして解釈されます。このクラスでは、8 進エスケープは常にゼロで開始する必要があります。このクラスでは、\1 から \9 は常に後方参照として解釈され、正規表現のそのポイントに少なくともその数の部分式が存在する場合、より大きな数が後方参照として受け入れられます。既存のグループ数以下であるか、または 1 桁です。

于 2012-12-14T13:53:27.860 に答える