Регулярные выражения Perl и их применение


         

в начало регулярного выражения якорь


Восклицание будет вставлено в каждую позицию строки:

!a!b!c!d!

Теперь поставим в начало регулярного выражения якорь \G:

$_='abcd'; s/\Gz*/!/g; print $_;

Восклицание будет вставлено только в начало строки:

!abcd

После первой итерации замены текущая позиция поиска продвинется на один символ и станет равна единице, а конец предыдущего совпадения будет равен нулю (в исходной строке). Поэтому поиск во второй итерации закончится неудачей, и замены на этом прекратятся.

Заметим еще, что если комбинируется поиск в скалярном и списковом контексте, то якорь \G хранит свое значение только после успешного поиска в скалярном контексте с модификатором g. После поиска в списковом контексте с модификатором g якорь \G сбрасывается в начало текста.

Рассмотрим такие примеры. Сначала ищем в скалярном, а затем в списковом контексте:

$_='abcd'; /\w/g; my @a=/\w/g; print @a;

Будет напечатано:

bcd

Символ a был пройден при первом поиске.

Теперь поменяем операторы:

$_='abcd'; my @a=/\w/g; print "@a\n"; if (/(\w)/g) { print "Found $1" }

Напечатается

a b c d Found a

Это можно объяснить тем, что поиск в списковом контексте продожается до своей неудачи, а она сбрасывает позицию поиска и якорь \G в начало текста. То же самое сделает и поиск в скалярном контексте, если он будет выполняться в цикле до исчерпания совпадений:

$_='abcd'; while (/(\w)/g) { print "$1 " } my @a=/\w/g; print "\n@a";

Будет напечатано:

a b c d a b c d

Запомните, что оператор поиска/замены, который хочет искать от конца предыдущего совпадения \G, обязательно должен иметь модификатор g!


Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий