Perl - 替换相同字符的序列

Dan*_*Dan 4 regex perl

我正在尝试实现一个正则表达式,给定一个字符串,它检查至少3个相同字符的序列,并将其替换为该字符中的两个.例如,我想转下面的字符串:

sstttttrrrrrrriing
Run Code Online (Sandbox Code Playgroud)

ssttrriing 
Run Code Online (Sandbox Code Playgroud)

我在考虑......

$string =~ s/(\D{3,})/substr($1, 0, 2)/e;
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为:

  1. 它不检查三个字母字符是否相同; 它可以匹配三个或更多不同字符的序列.
  2. 它只取代了第一场比赛; 我需要适应这个正则表达式中的所有匹配.

谁能帮我?

TLP*_*TLP 12

您可以使用捕获组并对其进行反向引用\1,然后将其插入两次.

$ perl -plwe 's/(.)\1{2,}/$1$1/g'
sstttttrrrrrrriing
ssttrriing
Run Code Online (Sandbox Code Playgroud)

或者您可以使用\K(保持)转义序列以避免重新插入.

s/(.)\1\K\1+//g
Run Code Online (Sandbox Code Playgroud)

.如果需要,将通配符替换为任何合适的字符(类).例如对于字母:

perl -plwe 's/(\pL)\1\K\1+//g'
Run Code Online (Sandbox Code Playgroud)