正则表达式 - 查找不包含子字符串的多行字符串

regex - find multiline string that does not contain substring

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

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

except
  FreeAndNil(result);
end;

虽然这些应该忽略:

except
  FreeAndNil(result);
  raise;
end;

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

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

匹配换行符的选项可以通过使用否定先行断言这些行不以 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