11

我正在尝试替换所有出现的hello(...)byhello[...]

%s/hello\((.*?)\)/hello\[$1\]/我尝试过没有任何成功的事情

有什么帮助吗?

4

1 回答 1

16

那是 Perl 语法,而不是 Vim。在 Vim 正则表达式中,至少在默认情况下,括号匹配自己并且反斜杠括号捕获 - 与 Perl 相反。此外,Vim 不理解非贪婪修饰符?,并且捕获组是用\n插值的,而不是$n。尝试这个:

%s/hello(\([^)]*\))/hello[\1]/

或者,您可以使用\v("very magic") 修饰符使特殊字符和反斜杠的行为更像 Perl,尽管它不会让 Vim 理解*?或更改其插值语法:

%s/\vhello\(([^)]*)\)/hello[\1]/

另外,请注意,替换文本中的方括号不需要反斜杠 - 替换命令的右侧不是正则表达式,因此您不必担心大多数特殊字符一。几乎只有反斜杠本身是特殊的,可用于包含捕获组或自身的文字实例或分隔符。

于 2012-05-02T05:36:43.840 回答