在实现一个小的脚本解析器时,我遇到了这个代码示例的问题--想要只选择"if { }“语句之间的部分并包括”if{}“语句,这是贪婪的,并且选择了包括最后一行在内的所有语句。我想我应该使用的是一个负向先行。
if [condition1]
{
task1
setparameters{a}
task2
}
if [condition2]
{
task3
}
setparameters{b}目前,我有:
if\b\s\[.*\]\s\{(\s|.)*\}我猜这也不像打破另一个“如果”那么简单,因为在那之前可能会有其他事情发生。可以计算相同数量的左大括号和右大括号吗?或者,有没有其他神奇的方法可以让我只选择其中一个“if”语句?
发布于 2013-08-06 23:25:42
当我尝试检测SQL字符串(可能有转义引号)时,我遇到了类似的问题,尝试使用正则表达式:if.*?\{(\{.*?\}|[^}])*+\}
它将匹配一个if,然后是condition,直到第一个{,然后如果它遇到{和} 之间的任何东西,或者任何不是}的东西,它都将继续匹配,然后是最后的结束}。
我使用了所有格量词来防止灾难性回溯的可能性。
发布于 2013-08-06 22:08:12
使用"?“作为限定符,表示"*“非贪婪。实际上,使用“+”可能更好:
\[.+?]
正如@It‘’sNotALie所说(转述),你会从一些解释中受益:
A sample of a nice tutorial
https://stackoverflow.com/questions/18082248
复制相似问题