使用正则表达式替换重复的字符组
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 组值。
在 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 组值。