使用正则表达式替换相同数量的重复字符

时间:2014-02-18 07:19:35

标签: regex string perl

我想用相同数量的重复字符替换重复字符和其他字符,如果它在字符串的开头重复。最小重复次数应大于2。

例如:$ string ='bbbbabcdeeeeee' 这里bbbb应该用yyyy替换

但是如果$ string ='bbcccccccddddddeeeffdfg'不应该替换任何东西,因为第一个重复字符不超过两次

$string =~ s/^(b){3,}/y/只能替换超过2 b到只有一个

是否可以使用一行正则表达式替换? 注意:如果有人在Perl或Python中做出响应,那就太好了。

4 个答案:

答案 0 :(得分:2)

您可以使用以下代码:

$string='bbbbcccccccddddddeeeffdfg';
$string =~ s/^((\w)\2{2,})/'y' x length($1)/e;
print $string. "\n";

输出

yyyycccccccddddddeeeffdfg
  • /e - >执行替换中的代码
  • 'y' x length($1) - >重复字符'y'的次数与匹配的组#1的长度相同

答案 1 :(得分:2)

怎么样:

my $re = qr~^((.)\2{2,})~;
while(<DATA>) {
    chomp;
    s:$re:'y' x length($1):e;
    say;
}


__DATA__
bbbbabcdeeeeee
bbcccccccddddddeeeffdfg
xxxxxx

<强>输出:

yyyyabcdeeeeee
bbcccccccddddddeeeffdfg
yyyyyy

答案 2 :(得分:0)

我不知道你会用哪种语言,但我会制作一个PHP脚本示例,你可以将其转换为你选择的语言:

php > echo preg_replace('/([^b])b{3}([^b])/','$1yyy$2','aaabbbccc');
aaayyyccc
php > echo preg_replace('/([^b])b{3}([^b])/','$1yyy$2','aaaabbbbcccc');
aaaabbbbcccc

修改

如果您只想匹配起始字符,请使用tick char:

php > echo preg_replace('/^b{3}([^b])/','yyy$2','aaaabbbbcccc');
aaaabbbbcccc
php > echo preg_replace('/^b{3}([^b])/','yyy$2','bbbbcccc');
bbbbcccc
php > echo preg_replace('/^b{3}([^b])/','yyy$2','bbbcccc');
yyyccc
php > echo preg_replace('/^b{3}([^b])/','yyy$2','bbcccc');
bbcccc

perl版本:

#/usr/bin/perl
$string = 'bbbccc';
$string =~ s/^b{3}([^b])/yyy$1/;
print $string;
$string = 'bbcc';
$string =~ s/^b{3}([^b])/yyy$1/;
print $string;
$string = 'bbbbcccc';
$string =~ s/^b{3}([^b])/yyy$1/;
print $string;

答案 3 :(得分:-1)

如果您只想替换特定字符,那么在bash中(使用sed)您可以使用以下内容:

# echo aabcddd | sed '/\(a\)\{3,\}/{s/a/y/g}'
aabcddd
# echo aaabcddd | sed '/\(a\)\{3,\}/{s/a/y/g}'
yyybcddd