在Vim中用正则表达式匹配捕获组

7
我想要找出包含同一字符串重复两次的单词。 (例如:wookokss(ok/ok),ccsssscc(ss/ss))。 我认为表达式应该是\(\w*\)\0
另一种尝试是找到由同一字符串重复两次组成的单词。我的答案是\<\(\w*\)\0\>。 (单词开头+分组(单词)+组捕获+单词结尾)
但它们都不起作用。有人能帮帮我吗?

2
我犯了2个错误。一个是因为空字符串使用了 * 。另一个是使用 \0 来表示整个字符串。 - Quexint
3个回答

5

要查找一个超过两个字符的单词中重复出现两次的字符串,您可以使用

/\(\w\{2,}\)\1

为了匹配包含上述字符串的整个单词,您可以使用:
/\<\w\{-}\(\w\{2,}\)\1\w\{-}\>

简要解释

  • \1 - 匹配与第一个子表达式 \(\) 中匹配的相同字符串(\0 匹配整个匹配的模式)
  • \{n,} - 匹配前面的原子至少 n 次,尽可能多地匹配
  • \{-} - 匹配前面的原子 0 次或多次,尽可能少地匹配
  • \w - 单词字符([0-9A-Za-z_]
  • \< - 单词的开头
  • \> - 单词的结尾

更多请参考:help pattern


3

1.) 包含两个连续重复字符串的单词(例如wookokss(ok/ok))

要查找包含两个或多个重复字符的单词,请尝试

\(\w\{2,}\)\1

\1 匹配第一个捕获组中捕获的内容。

2.) 查找由相同字符串重复两次组成的单词...

为了捕获\w\+,需要先匹配一个或多个单词字符,然后跟随着\1捕获的第一个组中的内容。

\<\(\w\+\)\1\>

应该就是这样了。点击这个教程,了解更多相关信息。

1

对于第一个,使用(.{2,})\1,示例在这里:https://regex101.com/r/gK0mM2/2 假设您只寻找具有多于一个字符的重复字符串。

对于第二个,使用^(.{2,})\1$,示例在这里:https://regex101.com/r/lC2yT7/2

编辑:更改了第二个表达式,现在它也可以寻找至少有两个字符的字符串。


4
很遗憾,regex101网站使用的语法与Vim正则表达式的语法无关。 - Sato Katsura
@SatoKatsura,你可能会喜欢查看Vim正则表达式101。http://vimregex.com/ - Brian Tiffin
@BrianTiffin (1) 这并不意味着答案是正确的,(2) vimregex.com 网站看起来像是一个非常过时的 Vim 正则表达式介绍(例如没有提到环视断言或者极其有用的 \zs\ze)。 - Sato Katsura
感谢@SatoKatsura的提醒。我通常使用那个页面进行快速提醒,对正则表达式的了解非常有限。 - Brian Tiffin

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