我试图解构为什么这在我的(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替代问题”标题,与该论坛的许多其他用户一致?
答案 0 :(得分:1)
使用单引号或转义反斜杠
:echo substitute("2321||aaaa|vvvv|334|mmmmm",'\([0-9]\+\)\(||.*\)$','\1','g')
请参阅:help expr-quote
和:help literal-string
。