我正在尝试实现一个regexp,给定一个字符串,它会检查至少3个相同字符的序列,并将其替换为该字符中的两个。例如,我想转下面的字符串:
sstttttrrrrrrriing
到
ssttrriing
我正在考虑一些类似......的事情。
$string =~ s/(\D{3,})/substr($1, 0, 2)/e;
但这不起作用,因为:
任何人都可以帮助我吗?
答案 0 :(得分:12)
您可以使用捕获组并使用\1
对其进行反向引用,然后再将其插入两次。
$ perl -plwe 's/(.)\1{2,}/$1$1/g'
sstttttrrrrrrriing
ssttrriing
或者您可以使用\K
(保留)转义序列以避免重新插入。
s/(.)\1\K\1+//g
如果需要,将通配符.
替换为任何合适的字符(类)。例如,对于字母:
perl -plwe 's/(\pL)\1\K\1+//g'
答案 1 :(得分:3)
$ echo "sssssttttttrrrrriiiinnnnggg" | perl -pe "s/(.)\1+/\1\1/g"
ssttrriinngg