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

lea*_*cal 0 regex r

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

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

Wik*_*żew 5

您可以使用

\b(?=\w*(\w)\1)\w+\b
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

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

\b\w*(\w)\1\w*\b
Run Code Online (Sandbox Code Playgroud)

另一个正则表达式演示.不需要为反向引用设置量词,\1因为即使两个重复的连续字符已经授权该字用于匹配.

图案细节:

  • \b - 领先的单词边界
  • (?=\w*(\w)\1)- 一个正面的预测,它将需要至少1个重复的单词字符(\w*将匹配0+单词字符,(\w)将匹配并捕获到第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"
Run Code Online (Sandbox Code Playgroud)

删除这些单词的演示:

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

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

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