首页 > 解决方案 > 正则表达式 - 匹配 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

标签: regexstringfilterexpression

解决方案


我认为你想要的负前瞻逻辑是它应该贪婪地消耗所有东西BEGIN直到最后一个END,只要它也没有看到 text PROCEDURE,这意味着它走得太远并且已经进入下一个过程块。

BEGIN((?!PROCEDURE).)*END;

演示


推荐阅读