2013-03-31 6 views
5

パターンマッチングでソースの消費された文字を再利用する方法はありますか?Java regex:パターンマッチングで消費された文字を再利用するには?

たとえば、正規表現(a+b+|b+a+) 、つまり複数のaの後に複数のbが続く、またはその逆のパターンを検索するとします。

は、入力がaaaabbbaaaaab

その後、正規表現を使用して、出力はIが出力

aaaabbb 
bbbaaaaa 
aaaaab 
+0

文字を再入力しないでください。 reg exを必要に応じて変更する必要があります。 – karmanaut

+0

これはあなたを助けることができるはずです:http://stackoverflow.com/questions/320448/overlapping-matches-in-regex –

答えて

6

であることを取得できますかaaaabbbaaaaab

このよう

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によって予測さaa
  • 開始によって予測さ
  • 開始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にマッチします、またはあなたが
+0

ありがとうございました:)。その本当に明確な答え。私は正規表現のバディで見ていたが、私は本当に正規表現に新しいので、いくつかの混乱がまだあります。正規表現では、^が意味するものを少し説明してください。 もう一度偉大な答えをありがとう。 – dshgna

+0

@dgun '^'は[anchor](http://www.regular-expressions.info/anchors.html)で、文字列の先頭に一致します。 – Pshemo

+0

この正規表現には本質的に必要ですか?何故ですか? (申し訳ありません、それはばかだ、私は好奇心:)) – dshgna

3

その前にbを持って前にaを持っていますlookbhindでこれをシミュレートできます:

((?<=a)b+|(?<=b)a+) 

これはputs

bbb aaaaa b 
関連する問題