我试图找出如何使正则表达式匹配过程块的第一个“ 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
答案 0 :(得分:-1)
我认为否定先行的逻辑是,它应该贪婪地消耗BEGIN
之后的所有内容,直到碰到最后一个END
,前提是它也看不到文本PROCEDURE
,这意味着它已走得太远,并已进入下一个过程块。
BEGIN((?!PROCEDURE).)*END;
答案 1 :(得分:-2)
如果要匹配所有块,也可以使用此正则表达式:
BEGIN((?!^(?!PROCEDURE)$).)*END