0

少し行き詰まっていて、誰かが助けてくれるかどうか疑問に思っています。正規表現を使用して値を見つけ、Funtion2が次の文字列の{}の間にあることを確認しようとしています。以下を参照してください。

AA \\*Funtion1 {5 + \\*Funtion2 {3} {4} + 6 } BB 

CC \\*Funtion2 {3} {\\*Funtion2 {3} {4} + 4} DD \\*Funtion2 {3} {4} EE

AA \\*Funtion1 { \\*Funtion2 {3} {4} + \\*Funtion2 {3} {4} + 6 } BB

2試合を返す必要がありますが、3を取得し続けます。

4

2 に答える 2

0

後読みを使用してみてください。

(?<=\{[^}]*)Funtion2

これにより、「{」が前にあるが、左中括弧とテキストの間に「}」がない「Funtion2」が検索されます。

ただし、これは左中括弧と右中括弧のバランスをとらないことに注意してください。あなたの例のテキストから、これが問題であるとは思いません。

次のシナリオが発生した場合、これはすべての一致を見つけることができません。

AA \\*Funtion1 { \\*Funtion2 {3} {4} + \\*Funtion2 {3} {4} + 6 } BB 

2 番目の 'Funtion2' は、開始の '{' との間に '}' があるため、スキップされます。

バランスの取れた正規表現を使用できますが、正直なところ、これは解析のように見えます。おそらく、パーサーを作成し、正規表現にあまり依存しないことを検討する必要があります。

于 2013-02-15T17:43:15.597 に答える
0

のように、中括弧内に中括弧が存在することはあります{3 + { whatever } }か? 関数名の一部ではないバックスラッシュ (例: \\*Funtion2) はありますか? 両方の質問に対する答えが「いいえ」の場合、バランスの取れたグループに頼ることなくこれを管理できるはずです. 例えば:

Regex r = new Regex(@"\{[^{}\\]*\\\\\*Funtion2(?:[^{}\\]+\{[^{}\\]+\})*[^{}\\]*\}");
foreach (Match m in r.Matches(source)
{
  Console.WriteLine(m.Value);
}

結果:

{5 + \\*Funtion2 {3} {4} + 6 }
{\\*Funtion2 {3} {4} + 4}

正規表現を分解すると、次のようになります。

\{              # the opening brace
[^{}\\]*        # optional stuff preceding the function name
\\\\            # the two backslashes
\*              # the asterisk
Funtion2        # and the name
(?:             # in a loop...
  [^{}\\]+        # stuff preceding the next opening brace
  \{[^{}\\]+\}    # a balanced pair of braces with non-braces in between
)*              # loop zero or more times
[^{}\\]*        # optional stuff preceding the closing brace
\}              # the closing brace
于 2013-02-16T11:45:13.787 に答える