You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则表达式捕获含嵌套过程的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:01:01