我在文件中有以下文字
23456789
当我尝试使用命令
替换上述文本时1,$s/\(\d\)\(\d\d\d\)\(\d\d\)*\>/\3\g
我得到了89
。不应该是6789
吗?任何人都可以告诉我为什么它是89
。
答案 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