2013-08-06 10 views
5

小さなスクリプトパーサーを実装する際、このコードサンプルで問題が発生しました。「if {}」ステートメントを含む部分だけを選択したい場合は、貪欲で、最後の行を含めてすべてを選択する。私が使うべきものは、否定的な先読みだと思います。現在C#RegEx同じパターンで貪欲な一致を繰り返す

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

if [condition2] 
{ 
    task3 
} 

setparameters{b} 

、私が持っている:

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

私はそれが別の何か他のものは、その前に来るかもしれないとして、いずれかの「もし」に壊すように単純ではないことを推測します。等しい数の開閉括弧を数えることは可能ですか?あるいは、これらの「if」ステートメントのうちの1つを選択するだけの他の魔法のような方法がありますか?

+1

あなたは '?'とその意義についてRegexで学ぶ必要があります。修正: 'if \ b \ s \ [。* \] \ s \ {(\ s |。)*?\}' –

+0

おそらく、なぜ私が*非欲張り - ループ内に閉じ括弧が現れる可能性があります。私はこれを表示するためにオリジナルを更新しました。 –

+0

ああ、バランスのとれたグループを見ています。私は彼らが何だったのか分からなかったので、私は質問を掲示した。答えは素晴らしいです。読んでください:[正規表現バランスグループとは何ですか?](http://stackoverflow.com/questions/17003799/What-are-regular-expression-balancing-groups) –

答えて

0

"?"修飾子は "*"非欲張りにします。実際には、 "+" を使用する方が良い場合があります。

A sample of a nice tutorial

2

\[.+?]

It'sNotALieは(言い換え)と@のよう

は、あなたは説明のビットから恩恵を受ける私はSQL文字列(エスケープされた引用符の可能性)を検出しようとしていたときに同様の問題に遭遇しました。正規表現を試してください:if.*?\{(\{.*?\}|[^}])*+\}

ifそれはどちらか何か最終クロージング}続い}、ではありません{}ORの間に遭遇した場合最初{まで、そしてその後からそれにマッチングまいります。

私は、壊滅的なバックトラックの可能性を防ぐために所有量限定子を使用しました。

関連する問題