首页 > 解决方案 > 为什么 ex (vim) 将匹配模式捕获到行尾

问题描述

文件包含以下行:

[assembly: AssemblyVersion("1.0.0.0")]

将一个版本替换为另一个版本的 Bash 脚本:

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

问题是为什么这会抓住整行到最后,所以我必须]在替换字符串的末尾添加?

标签: regexvimex

解决方案


出现问题是因为.*将所有字符匹配到行尾,\(\)创建一个捕获组(与大多数 NFA 正则表达式引擎不同,Vim 正则表达式匹配模式中未转义和未转义的(字符)。())

您可以使用

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

在这里,AssemblyVersion将匹配单词,然后\s*将匹配任何 0+ 空白字符,(将匹配文字([^()]*将匹配除(and之外的 0+ 字符))并将匹配文字)

您可以使用的另一个正则表达式替换命令是

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

在这里,AssemblyVersion\s*(将匹配AssemblyVersion, 0+ 个空格和(and\zs将从匹配中省略该部分, 然后 0+ 字符而不是(and)将被匹配, 然后\ze)将检查)当前位置的右侧是否有, 但不会添加它到比赛。

\zs将下一个字符设置为匹配的第一个字符。模式之前的任何文本\zs都不会包含在匹配中。

\ze设置比赛的结束。模式之后的任何内容\zs都不会成为匹配的一部分。


推荐阅读