【发布时间】:2018-08-24 08:29:48
【问题描述】:
我正在尝试找出如何创建一个正则表达式来匹配过程块的第一个“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
【问题讨论】:
-
正则表达式不是词法分析的工具。使用 ANTLR 或类似的东西...
-
你好维克托和安德鲁。致 Wiktor:谢谢,但是当涉及到像这种情况下的复杂代码块时:regex101.com/r/t6bEcT/1 模式不再起作用。致 Andrew:我要查找 ANTLR,谢谢您的回答!
-
@Kevin 我认为我的回答可能仍然可以用您的数据挽救。查看我上一条评论下的更新演示链接。
-
@Kevin with
sed命令使用 2 个缓冲区和正则表达式,并且可以为其提供脚本,您将能够执行您想要的操作,请参阅 grymoire.com/Unix/Sed.html 此备注也适用于awkgrymoire.com/Unix/Awk.html
标签: regex string filter expression