Regex 在Perl中中断正则表达式循环

Regex 在Perl中中断正则表达式循环,regex,perl,parsing,Regex,Perl,Parsing,在Perl正则表达式中,如何中断/ge循环 假设代码是: s/\G(foo)(bar)(;|$)/{ break if $3 ne ';'; print "$1\n"; '' }/ge; …此处打断不起作用,但它应该能说明我的意思。一般来说,我会将此作为一个while语句来写: while( s/(foo)(bar)/$1/ ) { # my code to determine if I should stop if(something) { last;

在Perl正则表达式中,如何中断/ge循环

假设代码是:

 s/\G(foo)(bar)(;|$)/{ break if $3 ne ';'; print "$1\n"; '' }/ge;

…此处打断不起作用,但它应该能说明我的意思。

一般来说,我会将此作为一个while语句来写:

while( s/(foo)(bar)/$1/ ) {
    # my code to determine if I should stop
    if(something) {
        last;
    }
}
此方法的警告是,每次搜索/替换都将从开头开始,这取决于您的正则表达式

如果确实希望在正则表达式中执行此操作,则可以编写一个函数,在到达终点时返回未修改的字符串,如本例中的计数:

my $count=0;

sub myfunc {
    my ($string, $a, $b) = @_;

    $count++;

    if($count > 3) {
        return $string;
    }

    return $a;
}

$mystring = "foobar  foobar, foobar + foobar and foobar";
$mystring =~ s/((foo)(bar))/myfunc($1,$2,$3)/ge;

# result: $mystring => "foo  foo, foo + foobar and foobar"

如果我知道你的具体情况,我可能会提供一个更有用的例子。

一般来说,我会将此作为一个while语句:

while( s/(foo)(bar)/$1/ ) {
    # my code to determine if I should stop
    if(something) {
        last;
    }
}
此方法的警告是,每次搜索/替换都将从开头开始,这取决于您的正则表达式

如果确实希望在正则表达式中执行此操作,则可以编写一个函数,在到达终点时返回未修改的字符串,如本例中的计数:

my $count=0;

sub myfunc {
    my ($string, $a, $b) = @_;

    $count++;

    if($count > 3) {
        return $string;
    }

    return $a;
}

$mystring = "foobar  foobar, foobar + foobar and foobar";
$mystring =~ s/((foo)(bar))/myfunc($1,$2,$3)/ge;

# result: $mystring => "foo  foo, foo + foobar and foobar"

如果我知道您的具体情况,我可能会提供一个更有用的示例。

您可以使用一些实验特性来模拟break语句,其中一些特性的Perl文档警告说,它们可能会在未来的Perl版本中发生更改

my $str = "abcdef";
my $stop = 0;
$str =~ s/(?(?{ $stop })(?!))(.)/ $stop = 1 if $1 ge "c"; "X" /ge;
print "$str\n";
这将打印XXXdef

逐段解释:

?条件是模式如果条件中的模式匹配,则匹配是模式,否则不匹配任何内容。 ?{code}在条件中执行代码,如果代码为true,则执行yes模式 ?! 将始终无法匹配,其含义类似于不匹配任何内容,因为“nothing”可以在字符串中的任何点匹配,所以它将失败。
因此,当$stop为true时,模式将永远无法匹配,而当$stop为false时,模式将匹配。

您可以使用一些实验特性来模拟break语句,其中一些特性的Perl文档警告说,它们可能会在未来的Perl版本中发生更改

my $str = "abcdef";
my $stop = 0;
$str =~ s/(?(?{ $stop })(?!))(.)/ $stop = 1 if $1 ge "c"; "X" /ge;
print "$str\n";
这将打印XXXdef

逐段解释:

?条件是模式如果条件中的模式匹配,则匹配是模式,否则不匹配任何内容。 ?{code}在条件中执行代码,如果代码为true,则执行yes模式 ?! 将始终无法匹配,其含义类似于不匹配任何内容,因为“nothing”可以在字符串中的任何点匹配,所以它将失败。
因此,当$stop为true时,模式永远不会匹配,而当$stop为false时,模式会匹配。

当不匹配时,正则表达式不会自动停止吗?您想实现什么?@JeffB-我写的示例可能是错误的-想法是能够在自动停止解析之前停止解析…出于某些原因,对于Perl新手来说,克服在一条语句中完成所有操作的想法是一个很大的障碍,通常是在匹配或替换运算符中完成正则表达式不匹配时不会自动停止吗?您想实现什么?@JeffB-我写的示例可能是错误的-想法是能够在自动停止解析之前停止解析…出于某些原因,对于Perl新手来说,克服在一条语句中完成所有操作的想法是一个很大的障碍,通常是在匹配或替换运算符中完成