regex - 正则表达式 - 匹配 BEGIN 和 END 之间的所有内容
问题描述
我试图找出如何使正则表达式匹配过程块的第一个“BEGIN”和最后一个“END”之间的所有文本。
这是我要过滤的文本:
PROCEDURE MyFirstFunction()@12345
VAR
TESTVAR@1 : Record 1;
TESTVAR@2 : Record 2;
BEGIN
// Here begins the code
IF 1 = 1 THEN BEGIN
IF 2 <> 1 THEN BEGIN
MESSAGE('2 is not equal to 1');
END;
MESSAGE('1 is equal to 1');
END;
END;
PROCEDURE MySecondFunction()@123456
VAR
TESTVAR@1 : Record 1;
TESTVAR@2 : Record 2;
BEGIN
// Here begins the code
IF 1 = 1 THEN BEGIN
IF 2 <> 1 THEN BEGIN
MESSAGE('2 is not equal to 1');
END;
MESSAGE('1 is equal to 1');
END;
END;
PROCEDURE MyThirdFunction()@123457
VAR
TESTVAR@1 : Record 1;
TESTVAR@2 : Record 2;
BEGIN
// Here begins the code
IF 1 = 1 THEN BEGIN
IF 2 <> 1 THEN BEGIN
MESSAGE('2 is not equal to 1');
END;
MESSAGE('1 is equal to 1');
END;
END;
我已经用递归正则表达式试过了,但这没有用。
这是我处理的正则表达式:
BEGIN(((?!BEGIN|END;).)|(?R))*END;
但我只得到第一个函数的第二个开始。
这是 regex101.com 的链接以测试正则表达式: https ://regex101.com/r/ZoBm6h/1
解决方案
我认为你想要的负前瞻逻辑是它应该贪婪地消耗所有东西BEGIN
直到最后一个END
,只要它也没有看到 text PROCEDURE
,这意味着它走得太远并且已经进入下一个过程块。
BEGIN((?!PROCEDURE).)*END;
演示
推荐阅读
- amazon-web-services - 您如何通过代码管道部署现有的部署工件?
- c - 我该如何修复它“func_addr”功能
- laravel - 如何在 laravel 8 和没有令牌访问前失眠的护照中控制 405 响应
- wix - 自定义操作作为 FileKey 成功,但从 WiXQuietExec 失败
- python - 有没有办法在 Kivy 中制作一个左侧有 3 个文本输入字段,右侧有 1 个长文本输入的 GUI?
- javascript - 是什么阻止了 loop_start 中的 wp_enqueue_script
- java - 在没有科学记数法的情况下格式化字符串中的双精度数
- google-sheets - 为什么谷歌表格另存为 PDF 不会在单元格中显示图标?
- json - 无法将 JSON 转换为对象
- c# - 无法使用其 XSD 反序列化来自 REST 服务的 HttpResponse 消息以生成 C# 类