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

大括号内是否会有大括号,例如{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 回答
0

尝试使用后视。

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

这将找到前面有“{”但在左大括号和文本之间没有“}”的“Funtion2”。

但是请注意,这并不能平衡左大括号和右大括号。从您的示例文本中,我认为这不是问题。

如果发生以下情况,这将无法找到所有匹配项:

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

第二个“Funtion2”将被跳过,因为它和开头的“{”之间有一个“}”。

您可以使用平衡的正则表达式,但老实说,这对我来说看起来像是在解析。也许您应该考虑编写一个解析器,而不是过于依赖正则表达式。

于 2013-02-15T17:43:15.597 回答