luofeiyu_cu 发表于 2014-01-01 16:59

如何匹配反复出现的单词?

我需要在vim中,将连续反复出现的单词保留一个,我这样写为何不行?

:%s/\<\(\w\+\)\>\s\1/1/g

这里的匹配模式是\<\(\w\+\)\>\s\1,这个模式为何不能匹配kitty kitty?
匹配成功后,我只保留一个kitty.

请问如何修改?

MMMIX 发表于 2014-01-01 17:55

本帖最后由 MMMIX 于 2014-01-01 17:56 编辑

回复 1# luofeiyu_cu


    我用 Vim 7.4 测试了下,是可以的。

luofeiyu_cu 发表于 2014-01-01 19:54

本帖最后由 luofeiyu_cu 于 2014-01-01 19:59 编辑

如果是三个或者多个连续的词,并且中间的空格可能不仅仅是一个,如何写?
:%s/\<\(\w\+\)\>\(\s\+\1\)\+/1/g
我这样写为何不能匹配成功呢?

MMMIX 发表于 2014-01-01 20:46

回复 3# luofeiyu_cu


    把用空格分割的多个连续相同单词替换成一个:
:s/\(\w\+\)\(\s\+\1\)\+/\1/
在 Vim 7.2 上测试通过。

luofeiyu_cu 发表于 2014-01-01 21:42

你那个我测试也通过了,请问,为何我的写法不成功,错误在哪里?

\<\(\w\+\)\>\(\s\+\1\)\+
我把它进行拆分

1. \<\(\w\+\)\>匹配一个单词
2.\(\s\+\1\)      匹配空格一个或者多个+前面匹配成功的单词
3.\+                   前面的部分出现一次或者多次

我的逻辑很严谨,出错在哪里?

MMMIX 发表于 2014-01-01 23:57

回复 5# luofeiyu_cu


    你这个我在 Vim 7.2 里面测试了一下,也可以正常工作。

井蛙夏虫 发表于 2014-01-02 00:32

我的vim7.3也可以工作,<和>放在第一对括号内也可以工作

luofeiyu_cu 发表于 2014-01-02 08:40

版本升级后,成功。
:%s/\<\(\w\+\)\>\(\s\+\1\)\+/\1/gc
现在我们再来个高难度的动作:

我要将hellohello替换成hello ,kittykittykitty 替换成kitty,类似这样的,连续出现,但是没有空格,如何操作?

MMMIX 发表于 2014-01-02 09:27

回复 8# luofeiyu_cu


    这个用正则根本没戏。需要用通用的语言编程来判断一个字符串是否是由其某一前缀重复多次构成。

luofeiyu_cu 发表于 2014-01-02 09:38

下面的模式可以将文章中的   早上好   替换成good morning
:%s/早上好/good morning/g   
为何下面的模式不可以将   早上好早上好   替换成good morning ?
:%s/\(早上好\s+\)\+/good morning/g
页: [1] 2
查看完整版本: 如何匹配反复出现的单词?