Regex Perl中的计算正则表达式替换
我想做一个全局正则表达式替换,替换是以一些不能放入正则表达式的逻辑为条件的。例如:Regex Perl中的计算正则表达式替换,regex,perl,Regex,Perl,我想做一个全局正则表达式替换,替换是以一些不能放入正则表达式的逻辑为条件的。例如: while ( $var =~ /<IF OPERATOR="(.+?)" VALUE="(.+?)"\/>/g ) { my $operator = $1; my $value = $2; if ( $operator eq 'true' && $hash{ $value } ) { # replace the entire <IF/&
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/>
}
}
while($var=~//g){
my$operator=$1;
我的$value=$2;
if($operator eq'true'&&$hash{$value}){
#更换整个
}
if($operator eq'false'&&!$hash{$value}){
#更换整个
}
}
如何更换钻头?谢谢你的建议。正则表达式中可以包含很多逻辑。例如,有,你可以 如果不想使regexp复杂化,可以先使用
substr EXPR,OFFSET,LENGTH,“
将它们拼接起来
但是,为了让使用regexp和and(评估替换)更有趣,下面是代码:
#!/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;
#/usr/bin/perl-w
严格使用;
我的%hash=(
foo=>1,
bar=>0
);
我的$var
';
$var=~
s`()
`$+{operator}eq'true'&&&$hash{$+{value}}|$+{operator}eq'false'&&$散列{$+{value}}?'更换:$1
`xeg;
打印$var;
$var=$ARGV[0];
我的%hash=(
a=>1,
b=>2
);
而($var=~//){
my$operator=$1;
我的$value=$2;
if($operator eq'true'&&$hash{$value}){
$var=~s//ReplacemenT/g;
}
if($operator eq'false'&&!$hash{$value}){
$var=~s//RR/g;
}
}
打印“$var\n”;
在类似于“xxxxxx”的问题上,如果您拒绝提供此问题的任何真实数据,或拒绝描述您想要的更改,则很难证明解决方案的可行性
但是,看起来您需要一个可执行的替换文件,它具有/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;
$string=~s{()}{
我的$replacement=$1;
my$operator=$2;
我的$value=$3;
if($operator eq'true'和$hash{$value}){
$replacement=qq{};
}
elsif($operator eq'false'而非$hash{$value}){
$replacement=qq{};
}
美元更换;
}eg;
$var=~s//这就是你的意思吗?把整个东西都拿走?如果你能举个例子说明你的替代品,那会很有帮助的。如果我理解你的话,$var=~s//代码>不适用于您的案例是的,我想将整个内容放在while{}中,但前提是while{}中的逻辑匹配。简单的s/A/B/g;不起作用,因为A比我能弄清楚如何放入正则表达式更复杂。例如,使用$hash{$value}的方式。测试正则表达式捕获的值的想法是我需要做的核心。我实际用什么替换它对这个问题不是很重要。OP希望替换满足条件的所有匹配项(注意/g
标志),而不仅仅是一个。看到了编辑,仍然不好。如果$var
包含表达式,则测试一次,然后用第一次匹配找到的特定值替换所有出现的值。不,仍然:)而没有/g
,因此它将只匹配第一次出现的值。有关如何解决此问题的信息,请参阅。返回到OP原始while
@Dan Dascalescu你能给我举个例子吗?它将用替换中指定的内容替换与条件匹配的所有引用。如果是$hash{$value}
,则结果将是一组不同的replacements@DanDascalescu是的,你是对的,这个解决方案不会对散列中的假值起作用。您的代码做得非常完美-做了我需要的,并且代码很容易遵循。非常感谢。
$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;