问题 vim搜索替换正则表达式


我正在尝试更换所有出现的 hello(...) 通过 hello[...]

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

有任何帮助吗?


4787
2018-05-02 05:31


起源



答案:


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

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

或者,您可以使用 \v (“非常神奇”)修饰符使关于特殊字符和反斜杠的行为更像Perl,但它不会让Vim理解 *? 或更改其插值语法:

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

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


16
2018-05-02 05:36