Регулярное выражение Perl — что означает модификатор gc?

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

$text =~ m/$regex/gcxs

Теперь я хочу знать, что означает модификатор 'gc':

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

Это мне непонятно. Что означает продолжение поиска?

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


person AnonGeek    schedule 09.07.2012    source источник


Ответы (2)


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

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

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

abcabc3de

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

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

Мы заканчиваем с

abc3de

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

person Sodved    schedule 09.07.2012
comment
Этот ответ был добавлен в Часто задаваемые вопросы о регулярных выражениях переполнения стека в разделе Модификаторы. - person aliteralmind; 10.04.2014

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

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

Указанный ref ведет к:

http://perldoc.perl.org/perlretut.html#Использование-регулярных-выражений-в-Perl

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

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

ХТХ Ли

person Lee Goddard    schedule 09.07.2012