Подтвердить что ты не робот

Perl Regular Expression - Что означает gc-модификатор?

У меня есть регулярное выражение, которое соответствует некоторому тексту как:

$text =~ m/$regex/gcxs

Теперь я хочу знать, что означает 'gc':

Я обыскал и обнаружил, что gc означает "Разрешить продолжить поиск после неудачного совпадения /g " .

Мне это непонятно. Что означает непрерывный поиск?

Насколько я понял, это означает, что начало совпадения начинается, если поиск /g завершается с ошибкой. Но не модификатор /g соответствует всей строке?

4b9b3361

Ответ 1

Модификатор /g используется для запоминания "позиции в строке", чтобы вы могли инкрементно обрабатывать строку. например.

my $txt = "abc3de";
while( $txt =~ /\G[a-z]/g )
{
    print "$&";
}
while( $txt =~ /\G./g )
{
    print "$&";
}

Поскольку позиция reset при неудачном совпадении, вышесказанное выведет

abcabc3de

Флаг /c не соответствует reset позиции при неудачном совпадении. Поэтому, если мы добавим /c к первому регулярному выражению, например,

my $txt = "abc3de";
while( $txt =~ /\G[a-z]/gc )
{
    print "$&";
}
while( $txt =~ /\G./g )
{
    print "$&";
}

В итоге получим

abc3de

Пример кода: http://ideone.com/cC9wb

Ответ 2

В perldoc perlre http://perldoc.perl.org/perlre.html#Modifiers

Глобальное сопоставление и сохранение текущей позиции после неудачного совпадения. В отличие от i, m, s и x эти два флага влияют на то, как используется регулярное выражение, а не само регулярное выражение. См. Использование регулярных выражений в Perl в perlretut для дальнейшего объяснения модификаторов g и c.

Указанный ref приводит к:

http://perldoc.perl.org/perlretut.html#Using-regular-expressions-in-Perl

Этот URI имеет подраздел под названием "Глобальное сопоставление", который содержит небольшой учебник/рабочий пример, включая:

Не удалось совпадение или изменение целевой строки сбрасывает позицию. Если вам не нужна позиция reset после несоответствия, добавьте //c, как в /regexp/gc. Текущая позиция в строке связана со строкой, а не с регулярным выражением. Это означает, что разные строки имеют разные позиции, и их соответствующие позиции могут быть установлены или прочитаны независимо.

НТН Ли