代码之家  ›  专栏  ›  技术社区  ›  James B.

消极的回头看似乎没有达到预期的效果

  •  2
  • James B.  · 技术社区  · 1 年前

    假设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
    

    我想匹配 1.0.0 不在之后的事件 @since 字符串,所以我只想匹配第二个和第三个。

    这个正则表达式必须在VS.Code中工作,我搜索了这个模式 (?<!since)(?:\s*)1\.0\.0 这似乎行不通。我错过了什么?

    https://regex101.com/r/BGtDx6/1

    2 回复  |  直到 1 年前
        1
  •  2
  •   bobble bubble    1 年前

    您可以添加另一个后视镜,仅在前面没有空格的地方进行后视镜:

    (?<!\s)(?<!since)\s*1\.0\.0
    

    See this demo at regex101

    这将防止后者在前面有空格的地方取得成功。
    如果需要,你可以 capture 空白和 reinsert 在替换字符串中 like this .

        2
  •  1
  •   123    1 年前

    由于空格的数量未知,一种方法是否定 since :

    ^(?im)\s*\*\s*(?!@since)[a-z]+\s*:\s*1\.0\.0
    

    然后使用捕捉组, 1.0.0 可以匹配:

    ^(?im)\s*\*\s*(?!@since)[a-z]+\s*:\s*(1\.0\.0)
    
    • ^ :表示线路的起点。
    • (?im) :表示不敏感和多行标志。
    • \s* :表示零个或多个空格。
    • \* :字面意思 *
    • (?!@since) :不包括 自从 .
    • [a-z]+ :一个或多个a到z字符(也可以添加其他字符)
    • (1\.0\.0) :是一个捕获组,包括 1.0.0 可以这样称呼 $1

    在VS Code环境中使用时,应删除内联标志:

    (?!@since)[\w\s]+:\s*(1\.0\.0)|^\s*\w+\s*\(\s*['"]\s*[^'"]*['"]\s*,\s*['"]\s*([^'"]*)['"]\s*\)\s*;
    

    您似乎正在尝试执行查找替换操作。在这种情况下:

    • 简单匹配 * @since 1.0.0 使用简单的正则表达式( @since\s+(1\.0\.0) )并用一个唯一的字符串替换它,例如 A0P8x&2% .
    • 然后,只需搜索 1.0.0 并做出改变。
    • 最后,更换 A0P8x和;2. 具有 *@从1.0.0开始 .