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

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未达到预期效果,问题出在哪里?

问题分析

你写的正则有两个核心问题:

  1. 漏掉了@符号:要排除的是@since后面的版本号,但你的断言只检查了since,完全没考虑前缀的@,逻辑从根上就错了。
  2. 断言范围太窄:(?<!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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:59:55