Perl - 替换相同字符的序列

时间:2012-05-27 22:29:45

标签: regex perl

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

sstttttrrrrrrriing

ssttrriing 

我正在考虑一些类似......的事情。

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

但这不起作用,因为:

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

2 个答案:

答案 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