Vim正则表达式替换

27

我认为这是一个非常简单的解决方案,但我已经尝试了一个小时,仍然无法找到答案。

我正在尝试在Vim中进行查找/替换,将以103开头并后跟四个数字的一系列数字替换为123,后跟相同的四个数字,如下所示:

1033303 -> 1233303
1033213 -> 1233213

我最接近的方法是:

%s/103\d\{4}/123\0/g

然而,这会导致整个数字被\0匹配,如下所示:

1033303 -> 1231033303

非常感谢任何帮助。


小心在vim中链接正则表达式的贪婪性是奇怪的。https://vi.stackexchange.com/questions/196/how-to-make-regex-matchers-non-greedy - ThorSummoner
4个回答

38

你已经非常接近了

%s/103\(\d\{4}\)/123\1/g

\(\)之间的模式是一个子匹配,可以通过\1\2等按出现顺序访问。有关更多信息,请参见:help \(


10

现在没有捕获组了!

:%s/103\ze\d\{4}/123/g

\ze将设置匹配的结束位置,这使得您可以匹配整个模式但只在其中一部分进行替换。

:h /\ze
:h /\zs

使用 \ze 后面的 .* 可以达到只匹配它前面的内容,忽略后面的所有内容的效果吗? - SergioAraujo
是的,这将防止在同一行上出现更多的匹配。 - Peter Rincker
这里有效::%s,103\ze.*,123,g 改变分隔符(快速输入)并匹配所有后续字符使用 .*,在替换时将被忽略。 - SergioAraujo

4

使用捕获组:

%s/103\(\d\{4}\)/123\1/g

2

试试这个:

%s#103\(\d\{4}\)#123\1#g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接