正则表达式-匹配BEGIN和END之间的所有字符

时间:2018-08-24 08:29:48

标签: regex string filter expression

我试图找出如何使正则表达式匹配过程块的第一个“ 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

2 个答案:

答案 0 :(得分:-1)

我认为否定先行的逻辑是,它应该贪婪地消耗BEGIN之后的所有内容,直到碰到最后一个END,前提是它也看不到文本PROCEDURE ,这意味着它已走得太远,并已进入下一个过程块。

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

Demo

答案 1 :(得分:-2)

如果要匹配所有块,也可以使用此正则表达式:

BEGIN((?!^(?!PROCEDURE)$).)*END