Vim正则表达式删除除最后两位数字之外的所有数字

时间:2009-01-14 11:32:09

标签: regex vim

我在文件中有以下文字

23456789

当我尝试使用命令

替换上述文本时
1,$s/\(\d\)\(\d\d\d\)\(\d\d\)*\>/\3\g

我得到了89。不应该是6789吗?任何人都可以告诉我为什么它是89

5 个答案:

答案 0 :(得分:4)

如上所述,你的正则表达式捕获一个数字,然后是三个数字,然后是任意数量的两个数字组。因此,第三场比赛将始终为两位数(如果存在)。在您的特定测试用例中,'89'位于\ 4,而不是\ 3。

将正则表达式更改为

 1,$s/\(\d\)\(\d\d\d\)\(\d\d\+\)\>/\3\g

会给你'6789'作为结果,因为它会捕获第三组中的两个或更多数字(最多可达到数字)。

答案 1 :(得分:4)

你想在这里使用非捕获组,如此

1,$s/\(\d\)\(\d\d\d\)\(\%(\d\d\)*\)\>/\3/g

这里给出了6789,如果输入更改为

2345678

会将该行更改为278

答案 2 :(得分:1)

组3定义为2位数。如果您希望匹配最后4位数字\(\d\d\d\d\),最后没有*。如果您只想匹配除前4位以外的所有数字,请将*放入群组匹配内而不是外围。

答案 3 :(得分:0)

你可能想要(需要一个额外的包装组):

%s/\(\d\)\(\d\d\d\)\(\(\d\d\)*\)\>/\3\g

虽然我不确定你为什么要捕获前两组。

答案 4 :(得分:0)

我在nvi中试过这个,但它不起作用。在vim中它起作用,只是你必须在g之前纠正最后的倒置短划线,如下所示:

1,$s/\(\d\)\(\d\d\d\)\(\d\d\)*\>/\3/g

它被89取代。 原因是你用*表示最后的\ d \ d可以重复零次,一次或多次,并且使用>你说的是结束词边界。 对于组3,你说你想要拉斯组,但由于*拉斯两位数(\ d \ d)是89。 拿出*>你可以得到6789.像这样:

1,$s/\(\d\)\(\d\d\d\)\(\d\d\)/\3/g

注意>谁正在扮演一个棘手的角色,因为:1,$s/\(\d\)\(\d\d\d\)\(\d\d\)\>/\3 你得到2389 LOL!因为从字边界的角度来看,dddddd匹配456789并且它被最后两个dd替换,那就是89.所以你得到23 + 89 心中一阵! LOL