如何将单词中的字符重复限制为2?

时间:2018-03-07 11:22:01

标签: r regex string

我想删除一个单词重复两次以上的字符。例如

 "hhaaappppyyyyyyy mmoooooorning friendsssssssssssssss, good goood day"

 "hhaappyy mmoorning friendss, good good day"

我尝试过类似的东西,但它并没有减少到恰好2次重复。

gsub('([[:alpha:]])\\1{2}', '\\1', 
   'hhaaappppyyyyyyy mmoooooorning friendsssssssssssssss, good goood day')

#[1] "hhappyyy mmoorning friendsssss, good god day"

谢谢。

3 个答案:

答案 0 :(得分:6)

您需要使用{2,}量词,并在替换中使用两个\1

s<-'hhaaappppyyyyyyy mmoooooorning friendsssssssssssssss, good goood day'
gsub('([[:alpha:]])\\1{2,}', '\\1\\1', s)
# => [1] "hhaappyy mmoorning friendss, good good day"

请参阅R demo

([[:alpha:]])\\1{2,}模式匹配并捕获到组1中的字母,然后匹配相同字符的2个或更多个重复。替换模式中的两个\1用2次出现的char替换整个匹配。使用两个\1占位符是有效的,因为每个匹配至少有3个相同的字符。

答案 1 :(得分:1)

与WiktorStribiżew相同,但在javascript中,如果您需要,还可以替换每个字符(数字,标点符号)。

var sInput = "hhaaappppyyyyyyy mmoooooorning friendsssssssssssssss, good goood day";
var sOutput = sInput.replace(/(.)\1{2,}/g, "$1$1");
console.log(sOutput);

答案 2 :(得分:1)

fwiw,这是另一个解决方案:

f = function(x){
    x = strsplit(x, '')[[1]]
    x = rle(x)
    x = rep(x$values, pmin(2, x$lengths))
    paste(x, collapse='')
}

示例:

x = "hhaaappppyyyyyyy mmoooooorning friendsssssssssssssss, good goood day"
f(x)
[1] "hhaappyy mmoorning friendss, good good day"

然而,gsub更容易......