1

特定のパターンで囲まれた情報で構成されるテキストがあります。私が知っている唯一のことはパターンです: "${template.start}" と ${template.end} 単純にするために、${template.start} と ${template.end} を例。

したがって、テキストの 1 つのエントリは次のようになります。

aINFORMATIONHEREa

これらのエントリがテキスト内でいくつ連結されているかわかりません。したがって、次も正しいです。

aFOOOOOOaaASDADaaASDSDADa

「a」で囲まれた情報を抽出する正規表現を書きたいと思います。

私の最初の試みは次のことでした:

a(.*)a

これは、テキストにエントリが 1 つしかない限り機能します。複数のエントリがあるとすぐに、.*すべてが一致するため失敗します。a(.*)aそのため、 onを使用するaFOOOOOOaaASDADaaASDSDADaと、テキストの最初の文字から最後の文字までのすべてを含むキャプチャ グループが 1 つだけになり、"a" になります。

FOOOOOOaaASDADaaASDSDAD

私が取得したいのは次のようなものです

captureGroup(0):  aFOOOOOOaaASDADaaASDSDADa
captureGroup(1): FOOOOOO
captureGroup(2): ASDAD
captureGroup(3): ASDSDAD

テキストから各エントリを抽出し、各エントリから「a」で囲まれた情報を抽出できると便利です。ちなみにQt4のQRegExpクラスを使っています。

ヒントはありますか?ありがとう!マーカス


この質問の複数のバリエーションが以前に見られました。関連するさまざまな議論:

そしておそらく他の...

4

3 に答える 3

6

貪欲でない表現を使用するだけです。つまり、次のようになります。

a(.*?)a
于 2009-01-20T14:35:35.030 に答える
3

次のように一致させる必要があります。

a[^a]*a
于 2009-01-20T14:39:29.733 に答える
0

すでにいくつかの有効な回答がありますが、少し無償のアドバイスを追加します。

構文解析に正規表現を使用するのは危険を伴う道です

編集:暗号化を避けるために: パワー、柔軟性、エレガンスがあるにもかかわらず、正規表現は、最も単純な文法以外を説明するのに十分な表現力がありません。ここで尋ねられた問題には十分ですが、入力言語がより複雑になった場合、ステート マシンや再帰的な適切なパーサーの適切な代替にはなりません。

そのため、入力ストリームの解析に RE を使用することを選択することは、注意して将来を見据えて行う必要がある決定です。

于 2009-01-20T15:08:36.307 に答える