如何将SUBSTITUTE()的功能与Vim的功能对齐:给定正则表达式的替换命令?

时间:2011-03-31 15:14:02

标签: regex vim

我试图解构为什么这在我的(g)Vim控制台中不起作用:

:echo substitute("2321||aaaa|vvvv|334|mmmmm","\([0-9]\+\)\(||.*\)$","\1","g")

...但是当光标位于文本2321||aaaa|vvvv|334|mmmmm的行上时,类似的命令.s/\([0-9]\+\)\(||.*\)$/\1/g将返回我的期望! (也就是说,它替换了文本2321

的行

我已将其缩小到以下差异,并想知道如何绕过它。我希望下面的命令返回||aaaa|vvvv||mmmmm

:echo substitute("2321||aaaa|vvvv|334|mmmmm","\([0-9]\)","","g")

相反,它返回输入2321||aaaa|vvvv|334|mmmmm的未更改版本,这意味着正则表达式\([0-9]\)找不到匹配项。删除括号,下面的命令工作:

:echo substitute("2321||aaaa|vvvv|334|mmmmm","[0-9]","","g")

SUBSTITUTE()命令相比,:substitute函数似乎具有严重限制的正则表达式能力。但是,文档 http://vimdoc.sourceforge.net/htmldoc/eval.html#substitute%28%29没有提到这一点。是否有解决方法,或者我是否遗漏了其他地方提到的内容?


(我在XP上运行gVim)

顺便说一下:目前制定的问题是否会增加或消除其清晰度/实用性?我本可以使用更简单但信息量较少的“Vim替代问题”标题,与该论坛的许多其他用户一致?

1 个答案:

答案 0 :(得分:1)

使用单引号或转义反斜杠

:echo substitute("2321||aaaa|vvvv|334|mmmmm",'\([0-9]\+\)\(||.*\)$','\1','g')

请参阅:help expr-quote:help literal-string