【问题标题】:regex - find multiline string that does not contain substring正则表达式 - 查找不包含子字符串的多行字符串
【发布时间】:2019-12-05 15:03:22
【问题描述】:

我需要查找缺少raise 关键字的某些代码块,如下所示:

这些是我正在搜索的匹配类型

except
  FreeAndNil(result);
end;

虽然这些应该忽略

except
  FreeAndNil(result);
  raise;
end;

请记住,exceptend; 关键字之间可能有任何类型或长度的文本。

我尝试了以下正则表达式:except((?!raise).)*end;,但它不适用于多行场景。

【问题讨论】:

  • 如果可以选择让点匹配换行符,您可以使用您的模式 regex101.com/r/puLnO6/1 或者可能使用内联修饰符 (?s)except((?!raise).)*end;except((?!raise)[\s\S])*end;
  • 你也可以匹配换行符而不是except\s*\n(?:(?![\t ]*\b(?:except|raise;)$).*\n)*end;regex101.com/r/Wx2bGx/1
  • @bobblebubble 我找到了this page,所以我认为确实如此,但我不太确定,因为我没有使用 delphi 的经验。这是你建议的一个很好的模式,甚至更少的步骤。
  • @bobblebubble 我认为您甚至可以将其缩短为 except\s*(?:\R.*)*?\R\s*(?:end|raise(*SKIP)(*F)); 如果它支持 PCRE,您也应该发布它:)
  • @Thefourthbird 确​​实!不知道为什么我把它放在周围!谢谢:)

标签: regex parsing delphi regex-lookarounds


【解决方案1】:

匹配换行符的选项可以通过使用否定前瞻断言这些行不以 except 或 end 开头来匹配 except 和 end 之间的所有行:

\bexcept\s*\r?\n(?:(?!(?:except|[\t ]+raise;)$).*\r?\n)*end;

部分

  • \bexcept\s*\r?\n 匹配除了,0+ 空白字符和换行符
  • (?:非捕获组
    • (?!负前瞻,断言右边的不是
      • (?:except|[\t ]+raise;)$) 匹配 except 或 1+ 个空格或制表符,raise; 后跟字符串结尾。
    • ) 关闭前瞻
    • .*\r?\n 匹配整行后跟换行符
  • )*重复非捕获组0+次
  • end; 字面匹配

Regex demo

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多