首页 > 解决方案 > 正则表达式 - 查找不包含子字符串的多行字符串

问题描述

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

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

except
  FreeAndNil(result);
end;

虽然这些应该被忽略

except
  FreeAndNil(result);
  raise;
end;

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

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

标签: regexparsingdelphiregex-lookarounds

解决方案


匹配换行符的选项可以通过使用否定前瞻断言这些行不以 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;从字面上匹配

正则表达式演示


推荐阅读