Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl中的计算正则表达式替换_Regex_Perl - Fatal编程技术网

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;