パターンマッチングでソースの消費された文字を再利用する方法はありますか?Java regex:パターンマッチングで消費された文字を再利用するには?
たとえば、正規表現(a+b+|b+a+)
、つまり複数のaの後に複数のbが続く、またはその逆のパターンを検索するとします。
は、入力がaaaabbbaaaaab
その後、正規表現を使用して、出力はIが出力
aaaabbb
bbbaaaaa
aaaaab
パターンマッチングでソースの消費された文字を再利用する方法はありますか?Java regex:パターンマッチングで消費された文字を再利用するには?
たとえば、正規表現(a+b+|b+a+)
、つまり複数のaの後に複数のbが続く、またはその逆のパターンを検索するとします。
は、入力がaaaabbbaaaaab
その後、正規表現を使用して、出力はIが出力
aaaabbb
bbbaaaaa
aaaaab
であることを取得できますかaaaabbb
とaaaaab
このよう
String data = "aaaabbbaaaaab";
Matcher m = Pattern.compile("(?=(a+b+|b+a+))(^|(?<=a)b|(?<=b)a)").matcher(data);
while(m.find())
System.out.println(m.group(1));
を試してみてくださいだろうあるとし
この正規表現の使用S look around機構と
b
によって予測さa
でa
b
と入力開始^
に存在(a+b+|b+a+)
ことがわかります。出力:
aaaabbb
bbbaaaaa
aaaaab
^
は、本質的に、この正規表現で必要とされていますか?
はい、^
せずに、この正規表現は、入力の先頭に配置aaaabbb
をキャプチャしません。
私は、この正規表現は、私は、これはその前にb
を持ってa
で始まる(しかし、試合でb
が含まれていませいるだけで、これらに結果を制限するために必要な
aaaabbb
aaabbb
aabbb
abbb
bbbaaaaa
bbaaaaa
baaaaa
aaaaab
aaaab
aaab
aab
ab
にマッチします(?=(a+b+|b+a+))
後(^|(?<=a)b|(?<=b)a)
を追加しないだろう場合 - そのためには後ろに見えることが完璧でした)、a
によって予測されるb
があります。
しかし、a
またはb
については、文字列の先頭に配置され、何も予測されません。それらを含めるには、^
を使用できます。
多分この正規表現
(?=(a+b+|b+a+))((?<=^|a)b|(?<=^|b)a)
でこのアイデアを表示することが容易になります。
(?<=^|a)b
は、文字列の先頭に配置されb
に一致する、またはそれが(?<=^|b)a
文字列の先頭に配置されa
にマッチします、またはあなたがその前にb
を持って前にa
を持っていますlookbhindでこれをシミュレートできます:
((?<=a)b+|(?<=b)a+)
これはputs
bbb aaaaa b
文字を再入力しないでください。 reg exを必要に応じて変更する必要があります。 – karmanaut
これはあなたを助けることができるはずです:http://stackoverflow.com/questions/320448/overlapping-matches-in-regex –