代码之家  ›  专栏  ›  技术社区  ›  awattar

为什么ex(vim)会在行尾捕捉匹配的模式

  •  1
  • awattar  · 技术社区  · 6 年前

    文件包含以下行:

    [assembly: AssemblyVersion("1.0.0.0")]
    

    echo "%s/AssemblyVersion\s*\(.*\)/AssemblyVersion(\"$newVersionNumber\")]/g
            w
            q
            " | ex $filePath
    

    问题是为什么要把整条线都抓到头,所以我必须补充一句 ] 在替换字符串的末尾?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    6 年前

    问题的出现是因为 .* \( \) 创建 捕获组 (与大多数NFA正则表达式引擎不同,Vim正则表达式匹配 ( ( ) 带着一个无替身的 ) 在模式中)。

    %s/AssemblyVersion\s*([^()]*)/AssemblyVersion(\"$newVersionNumber\")/g
    

    AssemblyVersion 会匹配这个词的 \s* 将匹配任何0+个空格字符, ( ( , [^()]* ( ) ) .

    您可以使用的另一个regex替换命令是

    :%s/AssemblyVersion\s*(\zs[^()]*\ze)/\"$newVersionNumber\"/g
    

    AssemblyVersion\s*( 程序集版本 ( \zs 将从匹配中忽略该部分,然后0+个字符 ( ) 会得到匹配,然后 \ze) 我去看看有没有 ) 在当前位置的右侧,但不会将其添加到匹配项中。

    \zs公司 \zs公司 图案将不包括在比赛中。

    \ze 设定比赛结束。有什么事吗 图案不属于比赛的一部分。