我想做一个全局正则表达式替换,其中替换是以一些不能放在正则表达式中的逻辑为条件的。例如:
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/>
}
}
如何进行#替换位?谢谢你的任何建议。
答案 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 backreferences和s///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