括在 {} 中的正则表达式
本文关键字:正则表达式 括在 | 更新日期: 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