Перерыв в цикле регулярных выражений в Perl - PullRequest
1 голос
/ 28 марта 2012

В регулярных выражениях Perl, как я могу разорвать цикл / ge ..?

Скажем, код:

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

... break здесь не работает, но это должно проиллюстрировать, что я имею в виду.

Ответы [ 2 ]

6 голосов
/ 28 марта 2012

Как правило, я бы написал это как while утверждение:

while( s/(foo)(bar)/$1/ ) {
    # my code to determine if I should stop
    if(something) {
        last;
    }
}

Предостережение при использовании этого метода заключается в том, что поиск / замена будет начинаться каждый раз с начала, что может иметь значение в зависимости от вашегоregex.

Если вы действительно хотите сделать это в регулярном выражении, вы можете написать функцию, которая возвращает неизмененную строку, если вы достигли конечной точки, например, счетчик в этом случае:

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"

Если бы я знал ваш конкретный случай, я мог бы привести более полезный пример.

1 голос
/ 29 марта 2012

Вы можете использовать некоторые экспериментальные функции для эмуляции оператора break, документация Perl для некоторых из этих функций предупреждает, что они могут измениться в будущих версиях Perl.

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

Будет напечатано XXXdef.

Мудрое объяснение:

  • (?(condition)yes-pattern), если шаблон в condition соответствует, то соответствует yes-pattern, в противном случае ничего не соответствует.
  • (?{ code }) выполнить code внутри условного кода, если код истинен, выполнить yes-pattern
  • (?!) всегда будет не в состоянии совпадать, это означает что-то вроде «Не сопоставлять ничего», и, поскольку «ничто» может быть сопоставлено в любой точке строки, произойдет сбой.

Таким образом, когда $stop истинно, шаблон никогда не может совпадать, а когда $stop ложно, он соответствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...