3

次の形式で作成された大きなテキストブロックでテキスト領域をキャプチャしようとしています。

...
[region:region-name]
multi line
text block
[/region]
...
[region:another-region-name]
more
multi-line text
[/region]

私はこれをほぼ解決しました

\[region:(?'link'.*)\](?'text'(.|[\r\n])*)\[/region\]

これは、テキスト全体に1つの領域しかない場合に機能します。しかし、複数ある場合、これにより、他のすべての「領域」がその1つの「テキスト」に含まれる1つのブロックだけが得られます。これはネガティブな先読みを使用して解決する必要があると感じていますが、正規表現を使用する非プロであるため、上記を正しく変更する方法がわかりません。誰かが助けることができますか?

4

2 に答える 2

5

あなたは先読みなしでこれを行うことができます:

\[region:(?'link'.*)\](?'text'(?s).*?)\[/region\]

追加?により、*数量詞が遅延するため、一致する文字ができるだけ少なくなります。また、(?s)この位置の後にドットを改行と一致させることができるため、下書きを使用する必要はありません(.|[\r\n])(別の方法として[\s\S])。

于 2011-02-15T18:02:53.867 に答える
1

ネガティブな先読みは必要ありません(?'text'(.|[\r\n])*)。「欲張りでない」ように変更するだけ[/region]で、最後のインスタンスではなく最初のインスタンスと一致するようになります。?の後に追加することでこれを行うことができる*ため、結果のパターンは次のようになります。

\[region:(?'link'.*)\](?'text'(.|[\r\n])*?)\[/region\]
于 2011-02-15T18:02:44.347 に答える