Переменные совпадения

До настоящего момента круглые скобки в шаблонах использовались только для группировки частей выражения. Однако в действительности круглые скобки также активизируют память ядра регулярных выражений. В памяти хранятся части строки, совпавшие с частью шаблона в круглых скобках. Если выражение содержит несколько пар скобок, будет сохранено несколько блоков. Каждая переменная в памяти регулярного выражения содержит часть исходной строки, а не часть шаблона. Так как эти переменные предназначены для хранения строк, они являются скалярными переменными; в Perl им присваиваются имена вида $1 и $2. Количество таких переменных определяется количеством пар сохраняющих круглых скобок в шаблоне. Как нетрудно догадаться, $4 означает строку, совпавшую с четвертой парой круглых скобок. Эти переменные являются немаловажным аспектом мощи регулярных выражений, потому что они позволяют выделять отдельные части из совпавшей строки:

$_ = "Hello there, neighbor";
if (/\s(\w+),/) { # Запомнить слово между пробелом и запятой
print "the word was $1\n"; # the word was there
}

В одном выражении можно использовать сразу несколько переменных:
$_ = "Hello there, neighbor";
if (/(\S+) (\S+), (\S+)/) {
print "words were $1 $2 $3\n";
}

Программа выводит перечень слов в исходной строке: Hello there neighbor.


Обратите внимание на отсутствие запятой в выводе. Так как запятая не входит в сохраняющие круглые скобки в этом шаблоне, она не включается во вторую переменную. При составлении шаблона можно точно указать, что должно быть сохранено в переменных, а что следует оставить. Переменные частичных совпадений могут быть пустыми1, если для соответствующей части шаблона не нашлось совпадения. Иначе говоря, переменная может содержать пустую строку:

my $dino = "I fear that I'll be extinct after 1000 years.";
if ($dino =~ /(\d*) years/) {
print "That said '$1' years.\n"; # 1000
}
$dino = "I fear that I'll be extinct after a few million years.";
if ($dino =~ /(\d*) years/) {
print "That said '$1' years.\n"; # Пустая строка
}

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Автоматические переменные совпадения
Границы слов
Добавление пропусков (/x)
Другие модификаторы
Жизненный цикл переменных частичных совпадений