4

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

sstttttrrrrrrriing

进入

ssttrriing 

我在想一些类似的事情......

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

但这不起作用,因为:

  1. 它不检查三个字母字符是否相同;它可以匹配三个或更多不同字符的序列。
  2. 它只替换第一个匹配项;我需要适应此正则表达式中的所有匹配项。

谁能帮我?

4

2 回答 2

12

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

$ perl -plwe 's/(.)\1{2,}/$1$1/g'
sstttttrrrrrrriing
ssttrriing

或者您可以使用\K(keep) 转义序列来避免重新插入。

s/(.)\1\K\1+//g

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

perl -plwe 's/(\pL)\1\K\1+//g'
于 2012-05-27T22:34:06.453 回答
3
$ echo "sssssttttttrrrrriiiinnnnggg" | perl -pe "s/(.)\1+/\1\1/g"
ssttrriinngg
于 2012-05-27T22:41:57.490 回答