使用正则表达式替换重复的字符组

Replacing repeated groups of characters using regex

在 R 中,我有一个字符串,其中包含重复的字符组:

testString <- "Hi hi missing u lollol hahahahalol sillybilly haaaaa!"

我正在尝试使用 gsub 正则表达式替换每个单词中重复的字符组以生成以下输出:

"Hi hi missing u lol halol sillybilly haaaaa!"

我尝试了以下行,但它没有产生正确的输出:

gsub("[[:blank:]](.+?){2,}[[blank]]\1",
replacement="\1", testString, perl=TRUE)

我做错了什么?

您可以匹配重复的连续字符并跳过它们,然后使用类似

的解决方案处理所有其他重复的连续字符
x <- "Hi hi missing u lollol hahahahalol sillybilly haaaaa!"
gsub("(\w)\1+(*SKIP)(*F)|(\w+?)\2+", "\2", x, perl=TRUE)

regex demo and an online R demo

详情:

  • (\w)\1+(*SKIP)(*F) - 匹配并捕获一个单词 char(使用 (\w),可以调整),然后出现 1+ 个相同的字符(使用 \1+),然后是整个文本被丢弃,引擎在匹配结束后继续搜索另一个匹配(使用 PCRE (*SKIP)(*FAIL) verbs 序列)
  • | - 或
  • (\w+?)\2+ - 1 个或多个单词字符,尽可能少,被捕获到第 2 组(使用 (\w+?)),然后匹配相同值的 1+ 次出现(使用 \2+).

替换的只是第 2 组值。