Perl中的计算正则表达式替换

时间:2014-02-27 04:47:47

标签: regex perl

我想做一个全局正则表达式替换,其中替换是以一些不能放在正则表达式中的逻辑为条件的。例如:

while ( $var =~ /<IF OPERATOR="(.+?)" VALUE="(.+?)"\/>/g ) {
    my $operator = $1;
    my $value = $2;

    if ( $operator eq 'true' && $hash{ $value } ) {
        # replace the entire <IF/>
    }
    if ( $operator eq 'false' && ! $hash{ $value } ) {
        # replace the entire <IF/>
    }
}

如何进行#替换位?谢谢你的任何建议。

3 个答案:

答案 0 :(得分:4)

您拒绝提供此问题的任何实际数据,或描述您想要的更改,这使得很难证明解决方案的可行性。

但是,您似乎需要可执行文件替换,其中包含/e修饰符。

看看这段代码。我在正则表达式中添加了另一对括号,以便捕获整个模式以及两个属性。实际的替换字符串放入$replacement并由块返回。

$string =~ s{(<IF OPERATOR="([^"]+)" VALUE="([^"]+)"/>)}{

    my $replacement = $1;
    my $operator    = $2;
    my $value       = $3;

    if ( $operator eq 'true' and $hash{$value} ) {
      $replacement = qq{<if state1="yes"/>};
    }
    elsif ( $operator eq 'false' and not $hash{$value} ) {
      $replacement = qq{<if state1="no"/>};
    }

    $replacement;
}eg;

答案 1 :(得分:1)

许多逻辑可以放在正则表达式中。例如,有conditional regular expressions,您可以execute Perl code in a regexp

如果您不想使正则表达式复杂化,可以先extract the offsets of the matches,然后使用substr EXPR, OFFSET, LENGTH, ''将它们拼接出来。

但是为了使用正则表达式的乐趣,使用named backreferencess///e(评估替换),这里是代码:

#!/usr/bin/perl -w
use strict;

my %hash = (
  foo => 1,
  bar => 0
);

my $var = '
<IF OPERATOR="true" VALUE="foo"/>
<IF OPERATOR="true" VALUE="bar"/>
<IF OPERATOR="false" VALUE="foo"/>
<IF OPERATOR="false" VALUE="bar"/>
';

$var =~
  s`(<IF\s+OPERATOR="(?<operator>.+?)"\s+VALUE="(?<value>.+?)"/>)
   `$+{operator} eq 'true' && $hash{ $+{value} } || $+{operator} eq 'false' && !$hash{ $+{value} }? 'replacement' : $1
   `xeg;

print $var;

答案 2 :(得分:-2)

$var=$ARGV[0];
my %hash =(
a => 1,
b => 2
);
while ( $var =~ /<IF OPERATOR="(.+?)" VALUE="(.+?)"\/>/ ) {
    my $operator = $1;
    my $value = $2;


    if ( $operator eq 'true' && $hash{ $value } ) {
        $var =~ s/<IF OPERATOR="$operator" VALUE="$value"\/>/ReplacemenT/g;
    }
    if ( $operator eq 'false' && ! $hash{ $value } ) {
        $var =~ s/<IF OPERATOR="$operator" VALUE="$value"\/>/RR/g;
    }
}
print "$var\n";

之类的'xxx<IF OPERATOR="true" VALUE="a"/>xxx'会返回xxxReplacemenTxxx