Perl Regular Expression - Что означает gc-модификатор?
У меня есть регулярное выражение, которое соответствует некоторому тексту как:
$text =~ m/$regex/gcxs
Теперь я хочу знать, что означает 'gc':
Я обыскал и обнаружил, что gc означает "Разрешить продолжить поиск после неудачного совпадения /g " .
Мне это непонятно. Что означает непрерывный поиск?
Насколько я понял, это означает, что начало совпадения начинается, если поиск /g завершается с ошибкой. Но не модификатор /g соответствует всей строке?
Ответы
Ответ 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. Текущая позиция в строке связана со строкой, а не с регулярным выражением. Это означает, что разные строки имеют разные позиции, и их соответствующие позиции могут быть установлены или прочитаны независимо.
НТН
Ли