VS Code中负向回顾后发断言失效,如何匹配非@since后的1.0.0?
正则匹配问题:排除@since后的版本号
问题场景
现有PHP代码如下:
/** * @since 1.0.0 <--- this shouldn't be matched * @package blah blah blah * Version: 1.0.0 <--- this should be matched */ /** * Fired during plugin activation. * * This class defines all code necessary to run during the plugin's activation. * * @since 1.0.0 <--- this shouldn't be matched * @package blah blah * @subpackage blah blah * @author blah blah */ define( 'PLUGIN_VERSION', '1.0.0' ); // <--- this should be matched
需求是匹配所有不跟随在@since字符串后的1.0.0,即仅匹配代码中的第二和第三个1.0.0。尝试使用正则(?<!since)(?:\s*)1\.0\.0未达到预期效果,问题出在哪里?
问题分析
你写的正则有两个核心问题:
- 漏掉了
@符号:要排除的是@since后面的版本号,但你的断言只检查了since,完全没考虑前缀的@,逻辑从根上就错了。 - 断言范围太窄:
(?<!since)是紧邻字符的负向断言,它只会检查1.0.0前面的字符是不是since,但@since和版本号之间有大量空格,1.0.0前面实际是空格,不是since,所以这个断言根本无法排除@since后的版本号,反而会把所有版本号都匹配到。
正确正则方案
在VS Code(基于PCRE2引擎,支持可变长度后行断言)中,使用以下正则即可实现需求:
(?<!@since\s*)1\.0\.0
解释
(?<!@since\s*):这是可变长度负向后行断言,会检查1.0.0的起始位置之前,是否存在@since加上任意数量的空白字符(空格、制表符都包含)。如果存在,则不匹配当前的1.0.0;反之则匹配。1\.0\.0:匹配目标版本号,转义.是因为.在正则中是通配符,需要匹配字面量的点。
如果要更严谨(确保@since和版本号之间至少有一个空格),可以改成:
(?<!@since\s+)1\.0\.0
内容的提问来源于stack exchange,提问作者James B.
相关产品推荐
相关产品推荐

