我想用相同数量的重复字符替换重复字符和其他字符,如果它在字符串的开头重复。最小重复次数应大于2。
例如:$ string ='bbbbabcdeeeeee' 这里bbbb应该用yyyy替换
但是如果$ string ='bbcccccccddddddeeeffdfg'不应该替换任何东西,因为第一个重复字符不超过两次
$string =~ s/^(b){3,}/y/
只能替换超过2 b到只有一个
是否可以使用一行正则表达式替换? 注意:如果有人在Perl或Python中做出响应,那就太好了。
答案 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