5

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

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

if [condition2]
{
  task3
}

setparameters{b}

目前,我有:

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

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

4

2 回答 2

2

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

它将匹配 anif后跟conditionup 直到第一个,然后从那时起,如果遇到a和之间的任何东西任何不是 a 的东西,{它将继续匹配,然后是最后的关闭。{} }}

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

于 2013-08-06T15:25:42.407 回答
0

用一个 ”?” 作为限定符使“*”不贪婪。事实上,使用“+”可能会更好:

\[.+?]

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

一个不错的教程示例

于 2013-08-06T14:08:12.463 回答