如何在Perl正则表达式中替换匹配的第n次出现?
发布时间:2020-12-16 06:24:07  所属栏目:大数据  来源:网络整理 
            导读:从 extracting the n’th regex match的早期问题开始,我现在需要替换匹配,如果找到的话. 我认为我可以定义提取子例程并在/ e修饰符的替换中调用它.我显然是错的(诚然,我有一个XY problem). use strict;use warnings;sub extract_quoted { # à la codaddict
                
                
                
            | 
                         
 从 
 extracting the n’th regex match的早期问题开始,我现在需要替换匹配,如果找到的话. 
  
  
我认为我可以定义提取子例程并在/ e修饰符的替换中调用它.我显然是错的(诚然,我有一个XY problem). use strict;
use warnings;
sub extract_quoted { # à la codaddict
        my ($string,$index) = @_;
        while($string =~ /'(.*?)'/g) {
                $index--;
                return $1 if(! $index);
        }
        return;
}
my $string = "'How can I','use' 'PERL','to process this' 'line'";
extract_quoted ( $string,3 );
$string =~ s/&extract_quoted($string,2)/'Perl'/e;
print $string; # Prints 'How can I','to process this' 'line' 
 当然,这种技术存在许多其他问题: >如果在不同的位置有相同的比赛怎么办? 鉴于这种情况,我想知道这可以通过哪些方式实施. 解决方法
 或者你可以这样做 
  
  
  
        use strict;
use warnings;
my $string = "'How can I','use' .... 'perl','to process this' 'line'";
my $cont =0;
sub replacen { # auxiliar function: replaces string if incremented counter equals $index
        my ($index,$original,$replacement) = @_;
        $cont++;
        return $cont == $index ? $replacement: $original;
}
#replace the $index n'th match (1-based counting) from $string by $rep
sub replace_quoted {
        my ($string,$index,$replacement) = @_;
        $cont = 0; # initialize match counter
        $string =~ s/'(.*?)'/replacen($index,$1,$replacement)/eg;
        return $string;
}
my $result = replace_quoted ( $string,3,"PERL");
print "RESULT: $resultn"; 
 有点丑陋的“全局”$cont变量,可以抛光,但你明白了. 更新:更紧凑的版本: use strict;
my $string = "'How can I','to process this' 'line'";
#replace the $index n'th match (1-based counting) from $string by $replacement
sub replace_quoted {
        my ($string,$replacement) = @_;
        my $cont = 0; # initialize match counter
        $string =~ s/'(.*?)'/$cont++ == $index ? $replacement : $1/eg;
        return $string;
}
my $result = replace_quoted ( $string,"PERL");
print "RESULT: $resultn";
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
