C#RegEx防止贪婪匹配重复相同的模式

时间:2013-08-06 13:56:05

标签: c# regex lookup greedy

在实现一个小脚本解析器时,我遇到了这个代码示例的问题 - 想要只选择“if {}”语句之间的部分,它是贪婪的并且选择所有包括最后一行。我猜我应该使用的是否定前瞻。

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

if [condition2]
{
  task3
}

setparameters{b}

目前,我有:

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

我想这并不像打破另一个'if'那样简单,因为之前可能还有别的东西。是否可以计算相同数量的开合括号?或者还有其他一些神奇的方法,我可以选择其中一个'if'语句吗?

2 个答案:

答案 0 :(得分:2)

我在尝试检测SQL字符串时遇到了类似的问题(可能有转义报价),请尝试使用正则表达式:if.*?\{(\{.*?\}|[^}])*+\}

它将匹配if后跟condition直到第一个{,然后从那时起它将继续匹配,如果它遇到之间的 > {} 任何非}的内容,然后是最终结算}

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

答案 1 :(得分:0)

使用“?”作为限定词使“*”非贪婪。事实上,使用“+”可能更好:

\[.+?]

正如@ItNotALie所说(转述),你会从一些解释中受益:

A sample of a nice tutorial