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

基于Oniguruma的VS Code私有语言语法支持:sub起始正则匹配问题

解决Oniguruma正则匹配私有语言Sub起始块的问题

问题背景

正在为VS Code开发某私有语言的语法支持,依赖Oniguruma正则引擎。需要编写两个正则分别匹配代码块的起始(sub行)与结束(end sub行)。已完成结束部分正则:

(?i)\b(\s*end\s* sub)\s*([_a-z][0-9_a-z]*)\s*;

现需编写起始正则,要求仅匹配左侧无“end\s*”的sub,尝试负向回溯(?<!end\s*)sub时遇到量词不允许的问题。

示例输入:

sub mysub1; 
  var i:Integer; 
  sub innersub1; 
    begin; 
  end sub innersub1; 
begin
end sub mysub1;

期望匹配两个代码块的起始行:sub mysub1; 和 sub innersub1;,分别对应结束行end sub mysub1;和end sub innersub1;。

解决方案

Oniguruma引擎支持可变长度后行断言,可以直接调整正则写法满足需求,正确的起始匹配正则如下:

(?i)\b(?<!end\s*)sub\s+([_a-z][0-9_a-z]*)\s*;

正则说明

  • (?i):忽略大小写,与结束正则保持一致的匹配规则
  • (?<!end\s*):后行断言,确保当前位置之前不存在“end”加任意数量空白字符的组合,精准排除“end sub”语句中的sub关键字
  • \b:单词边界,避免匹配包含sub的其他标识符(比如mysub这类变量名)
  • sub\s+:匹配sub关键字及后续至少一个空白字符
  • ([_a-z][0-9_a-z]*):匹配合法的sub名称(规则与结束正则中的命名组一致)
  • \s*;:匹配行尾的任意空白字符和分号

这个正则可以准确匹配示例中的两个起始sub行,不会误匹配end sub里的sub。

内容的提问来源于stack exchange,提问作者jenny03

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:23:19