2012-02-01 18 views
0

は、私が撮影した文字列は、他の二つの文字列ネストされた前後参照は

対象文字列のために、他の言葉でそう

の間にあることを確認するために、前後参照を使用してパターンを持っている

xxxcabyyy 

私の正規表現は

のように見えます
String myregex = ((?<=xxx)cab(?=[y]+)) 

私は

のような何か他のものを探している可能性があるため、私は、何度もこの正規表現の詳細を使用したいです
(test string) xxxcabyyy 

は、私は何でも私の正規表現がマッチする前にそれが来る「(テスト文字列)」を見つけると言って

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

のようなものである正規表現をしたいです。

これはちょうど正しく動作するようですが、私はそのbeacuseと思う正規表現で私は今見栄えに埋め込んでいるlookaroundがあります...私はこの状況を修正するために何ができますか?

答えて

0

あなたの推測は正しいです。文字列myregexにlookbehind構造とlookahead構造を指定しているため、これはうまくいかないでしょう。この問題を解決する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)); 
1

他のルックアラウンドの中にルックアラウンドを入れても問題ありませんが、なぜ必要なのかわかりません。実際、私は見回り期間の必要性を見ません。これは動作しませんか?

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

それはあなたが興味を持っているcab一部だと仮定すると、あなたはMatcher#group(1)を経由して、それを抽出することができます。

0

あなたが他の前後参照で前後参照して解決をしたい場合は、あなたが

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

またはそれがxxxcabyyyと続い(test string)だけのスペースあなたは後にしていることの間でだ場合は行うことができます。

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

(test string)と一致する時点では、xxxcabyyyをヒットする前にまだ文字が残っているため、先読みする必要があります。

関連する問題