为什么Vim替换命令`:s / \([a-zA-Z] \)\([a-zA-Z] \)/ \ 1 \ 2 / g`不会删除“a b c d”行上的所有空格

时间:2016-12-09 10:48:32

标签: regex vim

假设我有一条线:
a b c d
当我在行上执行替换命令:s/\([a-zA-Z]\) \([a-zA-Z]\)/\1\2/g时,它只删除两个空格,结果是:
ab cd
为什么它不会删除所有空间?

2 个答案:

答案 0 :(得分:3)

您获得的结果是预期的,因为上一个\([a-zA-Z]\)消费子模式。

使用表示与子模式匹配的文本是匹配的一部分。下一场比赛只能在前一场比赛之后开始,因此,第一次[a-zA-Z]将无法匹配b,因为它在第一次迭代中匹配。

要获取abcd,请使用:s/\([a-zA-Z]\) \([a-zA-Z]\)\@=/\1/g,其中\(...\)\@=是"预测"构造

答案 1 :(得分:1)

我会使用方便的\zs \ze

s/[a-zA-Z]\zs \ze[a-zA-Z]//g

完成这项工作。而且更容易阅读。

不同的是,此行仅匹配空格而不是[a-zA-Z]s。因此,您不必进行环视或组引用。

相关问题