括在 {} 中的正则表达式

本文关键字:正则表达式 括在 | 更新日期: 2023-09-27 17:59:39

我有点卡住了,想知道是否有人可以提供帮助,我试图使用正则表达式来查找值并检查 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 场比赛。

括在 {} 中的正则表达式

尝试使用回溯。

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

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

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

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

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

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

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

大括号内会有大括号吗,就像在{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