C# C正则表达式防止重复相同模式的贪婪匹配

C# C正则表达式防止重复相同模式的贪婪匹配,c#,regex,lookup,greedy,C#,Regex,Lookup,Greedy,在实现一个小型脚本解析器的过程中,我遇到了这个代码示例的一个问题——只想选择if{}语句之间的部分,这是贪婪的,并且选择了包括最后一行在内的所有部分。我想我应该用的是消极的前瞻 if [condition1] { task1 setparameters{a} task2 } if [condition2] { task3 } setparameters{b} 目前,我有: if\b\s\[.*\]\s\{(\s|.)*\} 我想这也不是简单的打破另一个“如果”,因为在那之

在实现一个小型脚本解析器的过程中,我遇到了这个代码示例的一个问题——只想选择if{}语句之间的部分,这是贪婪的,并且选择了包括最后一行在内的所有部分。我想我应该用的是消极的前瞻

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

if [condition2]
{
  task3
}

setparameters{b}
目前,我有:

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

我想这也不是简单的打破另一个“如果”,因为在那之前可能会发生其他事情。是否可以计算相等数量的左大括号和右大括号?还是有其他神奇的方法可以让我选择这些“如果”语句中的一个?

使用?作为限定符,表示*非贪婪。事实上,最好使用+:

\[.+?]

正如@It'sNotALie所说的,你会从一些解释中受益:


当我试图检测可能包含转义引号的SQL字符串时,我遇到了类似的问题,请尝试正则表达式:if.*\{\{.*\}|[^}]*+\}

它将匹配一个if,然后是条件,直到第一个{,然后从那时起,如果它遇到{and}之间的某个东西或任何不是}的东西,它将继续匹配,然后是最后的结束}


我使用所有格量词来防止灾难性回溯的可能性。

您需要了解吗?以及它在正则表达式中的意义。修复方法:如果\b\s\[.*\]\s\{\s |.*?}也许我应该再加一点限定,说明为什么我没有使*非贪婪-有可能在循环中出现右大括号}。我更新了原始版本来展示这一点。啊,然后你开始关注平衡组。我不知道它们是什么,所以我贴了一个问题。答案很好。读一下: