如何编写正则表达式捕获含嵌套过程的Pascal过程体?
捕获含嵌套结构的Pascal过程主体的正则实现
问题背景
需要编写正则表达式捕获Pascal过程的完整主体,核心难点是处理嵌套的过程定义以及任意层级的begin/end块,且不能依赖代码缩进格式——现有实现仅能处理规范缩进的代码,无法适配无缩进场景。
规范缩进测试用例
Test procedure A; procedure B; begin end; begin if True then begin end; end; procedure C; begin if True then begin end; end;
无缩进测试用例
Test procedure a; procedure b; begin end; begin if True then begin end; end; procedure c; begin if True then begin end; end;
期望匹配结果
procedure a; procedure b; begin end; begin if True then begin end; end;
解决方案
通过递归匹配处理嵌套的begin/end结构,同时跳过过程定义到首个begin之间的所有内容(包括子过程),最终实现不依赖缩进的匹配:
/procedure\s+a;\s*(?:(?!begin)[\s\S])*+(begin(?:(?!begin|end;)[\s\S]|(?1))*+end;)/is
关键逻辑解析
procedure\s+a;\s*:精准匹配目标过程的定义行,\s*忽略行尾任意空白字符(?:(?!begin)[\s\S])*+:匹配从过程定义到第一个begin之间的所有内容(包括嵌套子过程),*+为贪婪原子组,避免无效回溯提升匹配效率begin(?:(?!begin|end;)[\s\S]|(?1))*+end;:递归匹配begin/end块,(?1)引用自身捕获组,实现任意层级嵌套的begin/end匹配- 修饰符
i:忽略大小写,兼容Procedure/procedure等写法;s:让元字符匹配换行符,确保跨行内容能被正确捕获
扩展适配
若需匹配任意名称的过程(而非固定a),只需将a替换为\w+,调整后的正则:
/procedure\s+\w+;\s*(?:(?!begin)[\s\S])*+(begin(?:(?!begin|end;)[\s\S]|(?1))*+end;)/is
注意:正则仅适用于轻量级文本匹配场景,复杂语法解析建议使用专门的Pascal语法分析器。
内容的提问来源于stack exchange,提问作者Bruno Kinast
相关产品推荐
相关产品推荐

