如何在Perl中的字符串中搜索和替换特定次数的匹配?

时间:2010-01-29 10:53:34

标签: perl

如何使用s///;搜索并替换特定次数的匹配项。例如:

$string="abcabdaaa";

我想在a n次中将i替换为$string。我怎样才能做到这一点? n是用户提供的整数。

6 个答案:

答案 0 :(得分:9)

简单的答案可能并不是你想要的。

my $str = 'aaaa';
$str =~ s/a/a_/ for 1..2;
print $str, "\n"; # a__aaa. But you want a_a_aa, right?

您需要自己计算替换次数,并采取相应措施:

$str = 'aaaa';
my $n = 0;
$str =~ s/(a)/ ++$n > 2 ? $1 : 'a_' /ge;
print $str, "\n";

有关相关示例,请参阅常见问题解答How do I change the Nth occurrence of something?

答案 1 :(得分:6)

只需替换$ n次:

$string =~ s/a/i/ for 1..$n;

这样做。 更一般的解决方案是使用计数器进行全局替换:

my $i = 0; # count the substitutions made
$string =~ s/(a)/ ++$i > $n ? $1 : "i" /ge; 

答案 2 :(得分:4)

我不知道有任何旗帜可以做到这一点。我只是使用一个循环:

for (my $i = 0; $i < $n; $i++)
{
   $string =~ s/a/i/;
}

答案 3 :(得分:4)

你可以试试这个:

$str1=join('i',split(/a/,$str,$n));

答案 4 :(得分:1)

根据您对eugene y's answer

所做的评论,这是一种方法
#!/usr/bin/perl

use strict; use warnings;

my $string = '***ab***c';
my $n = 3;

1 while $n -- and $string =~ s/\*([^\n])/*\n$1/;

print "$string\n";

输出:

*
*
*
ab***c

答案 5 :(得分:0)

使用

sub substitute_n {
  my $n = shift;
  my $pattern = shift;
  my $replace = shift;
  local $_ = shift;

  my $i = 1;
  s{($pattern)} {
    $i++ <= $n ? eval qq{"$replace"} : $1;
  }ge;

  $_;
}

然后你可以写

my $s = "***ab***c";

print "[", substitute_n(2, qr/\*/, '$1\n', $s), "]\n";

获取以下输出:

[*
*
*ab***c]