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

本文关键字:模式 贪婪 C#RegEx | 更新日期: 2023-09-27 18:26:33

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

if [condition1]
{
  task1
  setparameters{a}
  task2
}
if [condition2]
{
  task3
}
setparameters{b}

目前,我有:

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

我想这并不像打断另一个"如果"那么简单,因为在那之前可能会发生其他事情。可以计算相等数量的大括号和大括号吗?或者还有其他神奇的方法可以让我选择其中一个"如果"语句吗?

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

我在尝试检测SQL字符串时遇到了类似的问题(可能有转义引号),请尝试regex:if.*?'{('{.*?'}|[^}])*+'}

它将匹配一个if,然后是condition,直到第一个{,然后从那时起,如果它遇到{}之间的任何不是}的东西,然后是最后的闭合},它将继续匹配。

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

使用"?"作为限定符使"*"不贪婪。事实上,使用"+":可能更好

'[.+?]

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

一个很好的教程的例子