5

小さなスクリプト パーサーを実装する際に、このコード サンプルで問題に遭遇しました。"if { }" ステートメントの間の部分とそれを含む部分のみを選択したい場合、それは貪欲で最後の行を含むすべてを選択します。私が使用すべきなのは否定的な先読みだと思います。

if [condition1]
{
  task1
  setparameters{a}
  task2
}

if [condition2]
{
  task3
}

setparameters{b}

現在、私は持っています:

if\b\s\[.*\]\s\{(\s|.)*\}

その前に別の何かが来るかもしれないので、別の「if」を壊すほど単純ではないと思います。左中括弧と右中括弧を同じ数だけ数えることは可能ですか? または、これらの「if」ステートメントの1つを選択できる他の魔法の方法はありますか?

4

2 に答える 2

2

SQL文字列を検出しようとしたときに同様の問題に遭遇しました(引用符がエスケープされている可能性があります)。正規表現を試してください:if.*?\{(\{.*?\}|[^}])*+\}

最初の まではに一致し、ifそれ以降は、aa以外のいずれかに遭遇した場合に一致を継続し、その後に最後の終了が続きます。condition{{} }}

壊滅的な後戻りの可能性を防ぐために、所有量指定子を使用しました。

于 2013-08-06T15:25:42.407 に答える
0

を使って "?" 修飾子として "*" を非貪欲にします。実際、「+」を使用する方が良い場合があります。

\[.+?]

@It'sNotALie が言ったように (言い換えて)、少し説明することでメリットが得られます。

素敵なチュートリアルのサンプル

于 2013-08-06T14:08:12.463 に答える