0

キャプチャされた文字列が他の2つの文字列の間にあることを確認するために、ルックアラウンドを使用するパターンがあります

つまり、件名の文字列に対して

xxxcabyyy

私の正規表現は次のようになります

String myregex = ((?<=xxx)cab(?=[y]+))

だから私はこの正規表現を複数回使用したいのです

(test string) xxxcabyyy

次のような正規表現が必要です

"\(test string\)(?=" + myregex + ")"

私の正規表現が一致するものの前にある「(テスト文字列)」を見つけると言います。

これは正確に機能していないようです。正規表現にルックアラウンドがあり、現在、ルックフォワードに埋め込んでいるためです...この状況を修正するにはどうすればよいですか?

4

3 に答える 3

1

ルックアラウンドを他のルックアラウンド内に配置しても問題ありませんが、なぜそうする必要があるのか​​わかりません。実際、ルックアラウンド期間は必要ないと思います。これはうまくいきませんか?

"\\(test string\\)\s*xxx(cab)y+"

興味のあるcab部分であれば、 で抽出できますMatcher#group(1)

于 2012-02-02T03:42:45.790 に答える
0

他のルックアラウンドのルックアラウンドを使用したソリューションが必要な場合は、次のことができます。

\(test string\)(?=.*?((?<=xxx)cab(?=[y]+)))

または、(test string)その後にxxxcabyyyが続き、その間にスペースがある場合は、次のようになります。

\(test string\)(?= *((?<=xxx)cab(?=[y]+)))

これは、一致した時点で(test string)、xxxcabyyyをヒットする前に移動する文字がまだあり、それらを先読みに含める必要があるためです。

于 2012-02-02T05:23:28.423 に答える
0

あなたの推測は正しいです-あなたはすでにあなたの文字列でlookbehindとlookahead構造を指定しているので、それは機能しませんmyregex。この問題を解決する1つの方法は、後読みと先読みの構成に必要な文字列を別々に保持し、それらを使用して、照合を行う必要がある直前に最終的な正規表現文字列を作成することです。たとえば、次のようなメソッドを記述して、lookbehindおよびlookahead構造と、それらの間で一致するものを指定して正規表現文字列を返すことができます。

public static String lookaroundRegex(String behind, String match, String ahead) {
    return "((?<=" + behind + ")" + match + "(?=" + ahead + "))";
}

その後、次のように使用できます。

String behind = "xxx";
String ahead = "[y]+";
String match = "cab";

// For the first case:
Pattern regexPattern1 = Pattern.compile(lookaroundRegex(behind, match, ahead));

// For the second case:
String behind2 = "\\(test string\\) " + behind;
Pattern regexPattern2 = Pattern.compile(lookaroundRegex(behind2, match, ahead));
于 2012-02-01T23:00:12.263 に答える