为什么ex(vim)捕获匹配模式到行尾

时间:2018-09-28 07:24:11

标签: regex vim ex

文件包含以下行:

[assembly: AssemblyVersion("1.0.0.0")]

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

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

问题是为什么这会导致整行都结束,所以我必须在替换字符串的末尾添加]

1 个答案:

答案 0 :(得分:1)

出现问题是因为.*将所有字​​符匹配到行尾,并且\(\)创建了捕获组(与大多数NFA regex引擎,Vim regex在模式中将(字符与未转义的()与未转义的)匹配)。

您可以使用

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

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

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

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

在这里,AssemblyVersion\s*(将匹配AssemblyVersion,0个空格,(\zs将从匹配中忽略该部分,然后是{{1以外的0个字符}}和(将被匹配,然后)将检查当前位置右侧是否有\ze),但不会将其添加到匹配中。

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

\zs设置比赛结束。 \ze模式之后的所有内容都不会成为匹配项。