2017-06-14 16 views
2

正規表現に一致するすべてのグループを1つの文にマッチさせようとしていますが、これらのグループには共通の文字が含まれています。 私はこの問題に直面している:この文で Exemple、:共通の文字を持つ正規表現のキャプチャグループ

A + B + C + D

を私はcatpureしたいと思います。その後、

A + B 

B + C 

次に

それは私が唯一+ BそしてC + Dの

にマッチしていますので、唯一の最後にマッチした文字の後に、次のグループをマッチング開始します(パターン ([A-Z] \+ [A-Z]) regex101付き)java.utils.regex.Matcher.find で
C + D 

正規表現でこれを行う方法はありますか?私は先読み内部の両方に一致するだろう

+1

を拡大しました。それ以外の場合は、それぞれの個別の要件について詳しく説明するたびに、アイデアを変更する必要があります。 – Pshemo

+0

今のところ、アイデアの1つは、1つの部分(A +)に一致し、先読みを使用して別の部分(B)をキャプチャすることです。それを書く方法は、実際のデータフォーマットに依存します。 – Pshemo

+0

あなたの答えは@Pshemoありがとう! 特別なデータ形式はありません。その後、AをBに、次にBをCに、CとDをマップに関連付けるだけです。 問題は、もし私が間違っていなければ先読みで、Bは最初の試合のグループにいないということです。 – tropseraph68

答えて

3

、その後、1

がグローバル(?=([A-Z]\s*\+\s*[A-Z]))[A-Z]
印刷グループ1を各一致を探すか、単に配列を取得し消費します。

大文字と小文字を重複して使用します。
アサーション内で必要以上にマッチさせてから消費してください。
消費は、次の一致の開始を置き換えます。

このプロセスは重複します。我々はすべてのソリューションは、我々が入力について知っておくべきすべての要件を投稿示唆する前に

(?= 
     ([A-Z] \s* \+ \s* [A-Z]) # (1) 
) 
[A-Z] 

マッチ

** Grp 1 - (pos 0 , len 5) 
A + B 
    ** Grp 1 - (pos 4 , len 5) 
B + C 
    ** Grp 1 - (pos 8 , len 5) 
C + D 
+0

最後の '[A-Z]'は何ですか? ''(?=([A-Z] \\ s * \\ + \\ s * [A-Z])) ""も働きます。 – saka1029

+0

@ saka1029 - はい。あなたが見つけたのは、_バンプ・アゲイン_と呼ばれるものです。正規表現エンジンがゼロ幅アサーションに一致し、何も消費されない場合(すなわち、最後の '[A-Z]')、自動的に現在の位置を1文字ずつインクリメントします。したがって、この '1234 'に対して使用されるこの'(?=(。)) 'は4つのマッチを見つけるでしょう。現実には、 '[AZ]'は自然な長さ> 1を持つ大きなサブ式である可能性があります。この場合、次のマッチのために+ 1の位置にトラップされないように直接消費する必要があります。それはもちろん '[A-Z]'があなたのユニットである場合です。 – sln

+0

@ saka1029 - 例https://regex101.com/r/Bgm2j0/2これとは対照的にhttps://regex101.com/r/Bgm2j0/3 – sln

関連する問題