在实现一个小脚本解析器时,我遇到了这个代码示例的问题 - 想要只选择“if {}”语句之间的部分,它是贪婪的并且选择所有包括最后一行。我猜我应该使用的是否定前瞻。
if [condition1]
{
task1
setparameters{a}
task2
}
if [condition2]
{
task3
}
setparameters{b}
目前,我有:
if\b\s\[.*\]\s\{(\s|.)*\}
我想这并不像打破另一个'if'那样简单,因为之前可能还有别的东西。是否可以计算相同数量的开合括号?或者还有其他一些神奇的方法,我可以选择其中一个'if'语句吗?
答案 0 :(得分:2)
我在尝试检测SQL字符串时遇到了类似的问题(可能有转义报价),请尝试使用正则表达式:if.*?\{(\{.*?\}|[^}])*+\}
它将匹配if
后跟condition
直到第一个{
,然后从那时起它将继续匹配,如果它遇到之间的 > {
和}
或任何非}
的内容,然后是最终结算}
。
我使用占有量词来防止灾难性回溯的可能性。
答案 1 :(得分:0)