Perl Regular Expression - Что означает модификатор gc?
У меня есть регулярное выражение, которое соответствует некоторому тексту как:
$text =~ m/$regex/gcxs
Теперь я хочу знать, что означает модификатор 'gc':
Я искал и обнаружил, что gc означает "Разрешить продолжение поиска после сбоя / совпадения g".
Это мне не понятно. Что означает продолжение поиска?
Насколько я понял, это означает, что начинать сопоставление нужно с самого начала, если поиск /g не удался. Но не соответствует ли модификатор /g всей строке?
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
В perldoc perlre http://perldoc.perl.org/perlre.html
Глобальное сопоставление и сохранение текущей позиции после неудачного сопоставления. В отличие от i, m, s и x, эти два флага влияют на то, как используется регулярное выражение, а не на само регулярное выражение. См. Использование регулярных выражений в Perl в perlretut для дальнейшего объяснения модификаторов g и c.
Указанная ссылка приводит к:
http://perldoc.perl.org/perlretut.html
Этот URI имеет подраздел, озаглавленный "Глобальное соответствие", который содержит небольшой учебник / рабочий пример, в том числе:
Неудачное совпадение или изменение целевой строки сбрасывает позицию. Если вы не хотите, чтобы сброс позиции после сбоя совпадал, добавьте // c, как в / regexp / gc. Текущая позиция в строке связана со строкой, а не с регулярным выражением. Это означает, что разные строки имеют разные позиции, и их соответствующие позиции могут быть установлены или считаны независимо.
HTH Ли