2

私の質問はかなり単純ですが、それが果たす目的はかなり複雑です。簡単な例を使用します。

AzzAyyAxxxxByyBzzB

Aしたがって、通常、との間のすべてを取得したいと思いますBAただし、最初と最後B(1 つのペア)の間のコンテンツの一部には追加のABペアが含まれているため、一致の終了をプッシュバックする必要があります。(その最後の部分が理にかなっていたかどうかはわかりません)。

したがって、私が探しているのは、次の出力を可能にする正規表現です。

Match 1
  Group 1: AzzAyyAxxxxByyBzzB
  Group 2: zzAyyAxxxxByyBzz

次に、それを再度一致させて取得します。

Match 2
  Group 1: AyyAxxxxByyB
  Group 2: yyAxxxxByy

そして最後にもう一度取得します:

Match 3
  Group 1: AxxxxB
  Group 2: xxxx

明らか(A(.*?)B)に、入力全体を試してみると、次のようになります。

Match x
  Group 1: AzzAyyAxxxxB
  Group 2: zzAyyAxxxx

これは私が探しているものではありません:)

これが理にかなっていることを願っています。これが RegEx で実行できないかどうかは理解していますが、あきらめて別のことを試す前に、正規表現のウィザードに尋ねてみようと思いました。ありがとう!

追加情報:

私が取り組んでいるプロジェクトはJavaで書かれています。

もう1つの問題は、次のようなものを含む可能性のあるドキュメントを解析していることです:

AzzAyyAxxxxByyBzzB
Here is some unrelated stuff
AzzAyyAxxxxByyBzzB
AzzzBxxArrrBAssssB

そして、上のペアは下のペアABから分離する必要がありますAB

4

3 に答える 3

2

を使用して、正規表現を明示的に非貪欲にしました?。そのままにしておくと、正規表現は次のものに一致する前に可能な限り消費しますB:

(A(.*)B)

ただし、通常、ネストされた構造は正規表現の範囲を超えています。このような場合:

AxxxByyyAzzzB

また、最初Aから最後のB. シナリオでこれが可能である場合は、文字列を 1 文字ずつ調べてAs とBs を数えて、どちらが一緒に属しているかを判断する方がよい場合があります。

編集:

質問を更新し、コメントでこれを理解したので、複数の連続したペアの問題がありますこの場合、再帰をサポートしない正規表現エンジンでは実行できません。

ただし、裏返しにマッチングに切り替えることはできます。

A([^AB]*)B

区切り文字の間にanAも aも存在できないため、これは最も内側のペアのみを取得します。B見つかった場合は、ペアを削除して次の試合に進むことができます。

于 2012-11-06T23:13:36.237 に答える
0

正規表現だけではこれを行うことはできません。あなたが説明しているのは、通常よりもコンテキストフリーです。このようなものを解析するには、「A」に遭遇するたびに新しいコンテキストをスタックにプッシュし、「B」に遭遇するたびにスタックをポップする必要があります。正規表現よりもプッシュダウン オートマトンのようなものが必要です。

于 2012-11-06T23:31:19.263 に答える
0

複数行モードを使用する場合は単語境界を使用します。

\bA(.*)B\b  #for matches that does not start from beginning of line to end

また

^A(.*)B$    #for matches that start from beginning of line till end
于 2012-11-06T23:18:09.050 に答える