基于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
相关产品推荐
相关产品推荐

