3

私は次のような文字列を持っています

{! texthere }

{!最後まで、または最初の}に到達するまで。だから私が持っていたら

{!text here} {!text here again} {!moretexthere。ああ少年!

["{!text here}"、 "{!text here again}"、 "{!more texthere。ohboy!"]

これでうまくいくと思いました

{!。*} ??

ただし、上記の文字列は["{!text here} {!text here again} {!more text here。Ohboy!"]になります。

私はまだ正規表現に非常に不慣れなので、これが機能しない理由がわかりません。'{!'と一致すると思います そこにない可能性のあるブラケット(貪欲ではない)に到達するまで、任意の数の文字が続きます。

4

4 に答える 4

5

ポジティブルックビハインドの 使用(?<={!)[^}]+

In [8]: import re

In [9]: str="{!text here} {!text here again} {!more text here. Oh boy!"

In [10]: re.findall('(?<={!)[^}]+',str)
Out[10]: ['text here', 'text here again', 'more text here. Oh boy!']

}これは、次の場合に文字以外の文字が一致するという前向きな見方{!です。

于 2013-02-15T14:54:49.270 に答える
2

気が進まない数量詞を使用したいと思います。

{!.*?}?

これにより、最後ではなく.最初のフォローが見つかるとすぐに、の一致が停止します。}

貪欲で消極的な数量詞について質問がありましたが、ここで良い答えがあります。

もう1つのオプションは、次のように2つの中括弧の間に入ることができる文字を指定することです。

{![^}]*}?

これは、パターン内で一致する閉じ中括弧が存在しないことを指定します。

于 2013-02-15T14:53:15.250 に答える
2

あなたはこのようにそれを行うことができます:

({![^}]+}?)

正規表現画像

Debuggexでライブ編集

$1次に、最初の括弧のセットに対応するキャプチャグループを回復します。

この方法を使用すると、正規表現自体が単一のグループ関数と一致するように作成されるため、「すべて一致」タイプの関数を使用する必要があります。

この方法では、見回す必要はありません。また、を使用すると、表現全体を実行してからバックトラックするのではなく、ブレーカーとして^}次を検索するため、正規表現エンジンサイクルの数を制限する必要があります。}

于 2013-02-15T14:57:13.303 に答える
1

ツール/言語がperl正規表現をサポートしている場合は、次のことを試してください。

(?<={!)[^}]*
于 2013-02-15T14:55:51.250 に答える