3

明確にするために、一致させたい:


あぁあぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ …
_

これはPerlで動作します:

if ($exp =~ /^(a(?1)?b)$/)

これを理解するには、文字列が左右ではなく外側から伸びているように見てください。

ab
a(ab)b
aa(ab)bb

(?1)括弧の外側のセットへの参照です。最後のケース (外側から内側へ) には after が必要です?。何も残らず?、前の式の 0 または 1 を意味します (したがって、基本的に基本ケースとして機能します)。

(?1)Javaで同等のものは何ですか?と尋ねる同様の質問を投稿しました。今日、それ\\1が最初の捕獲グループを指していることを知りました。だから、私はこれがうまくいくと思いました:

String pattern = "^(a(?:\\1)?b)$";

しかし、そうではありませんでした。誰かが理由を知っていますか?

注意:これを行うには、他にもより良い方法があることを知っています。これは厳密には教育上の問題です。のように、この特定の方法が機能しない理由と、それを修正する方法があるかどうかを知りたいです。

4

1 に答える 1

1

は後方参照であり、Perl での再帰のようなパターンではなく、グループの\\1を参照します。残念ながら、Java 正規表現は再帰をサポートしていませんが、ルックアラウンドと後方参照を使用してパターンを表現できます。(?1)

于 2013-07-10T00:21:12.813 に答える