正则表达式匹配包含重复字符的整个单词

时间:2016-05-03 19:37:23

标签: regex r

全部 - 需要一个匹配包含重复多次字符的整个单词的正则表达式。例如,给出句子"这里有一些测试词"我想匹配" areee"和"测试"。

"([a-z])\ 1 {1,}"匹配重复的字符,但它返回" eee"和" ttt"而不是包含重复字符的整个单词。我使用" \ w"进行了多种变体实验。用于单词和" \ b"对于单词边框,但似乎无法使其正常工作......谢谢!

2 个答案:

答案 0 :(得分:5)

您可以使用

\b(?=\w*(\w)\1)\w+\b

请参阅regex demo

没有前瞻的更多增强版本(类似于Federico Piazzi中建议的comment below)看起来像

\b\w*(\w)\1\w*\b

another regex demo。没有必要为反引用\1设置量词,因为即使两个重复的连续字符已经授权该字匹配。

模式细节:

  • \b - 领先的单词边界
  • (?=\w*(\w)\1) - 需要至少1个重复单词字符的正面预测(\w*将匹配0 +单词字符,(\w)将匹配并将1个单词字符捕获到第1组并且\1将与将与...匹配的单词中捕获到组1中的相同字符匹配。
  • \w+ - 1个字符
  • \b - 尾随字边界

重复连续字母提取的字的R代码演示

> library(stringr)
> text = "here areee some testtting words"
> str_extract_all(text, "\\b(?=\\w*(\\w)\\1)\\w+\\b")
[[1]]
[1] "areee"     "testtting"

这些单词的演示删除

> gsub("\\s*\\b(?=\\w*(\\w)\\1)\\w+\\b", text, replacement = " ", perl = TRUE)
[1] "here  some  words"

请参阅模式开头添加的\\s*,以便在要删除的单词之前修剪空格(如果有)。如果您还需要删除删除第一个单词后出现的初始空格,请使用trimws()

注意:如果您打算只检查重复的字母,请使用\b(?=\w*([a-zA-Z])\1)\w+\b

答案 1 :(得分:0)

你需要做的只是用必要的胡言乱语填充它

^[a-z]*([a-z])\1{1}[a-z]*$

如评论中所述,{1}永远不是必需的。这样做:

^[a-z]*([a-z])\1[a-z]*$

在此处观看演示

https://regex101.com/r/dT6dK8/1

如果您希望内联工作

,请移除^$