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


Группировка элементов шаблона - часть 2


скобки бы совпали с пустым фрагментом в начале строки, а переменная $1 получила бы неопределенное значение. Ее попросту не было бы ввиду нулевого значения квантификатора. Если бы этот квантификатор стоял внутри скобок:

'abc' =~ /(\w*?)/;

то переменная $1 существовала бы и имела бы пустое значение.

Теперь рассмотрим несохраняющие (группирующие) скобки:

(?: шаблон )

Шаблон в них может и отсутствовать (быть пустым).

Такие скобки, как мы знаем, не создают нумерованной переменной, а служат для группировки подшаблонов, чтобы поставить к этой группе квантификатор или отделить альтернативные шаблоны от остального регулярного выражения. Между знаком вопроса и двоеточием могут стоять квантификаторы, например:

(?im:^passport nr\. \d+)

Область действия этих квантификаторов ограничена шаблоном, стоящим в этих группирующих скобках. Это означает, что внутри этих скобок будет действовать режим поиска без учета регистра и метасимвол ^ будет совпадать не только в начале текста, но также в начале каждой логической строки, т.е. сразу после символа \n, если толко он не стоит самым последним в тексте. Но, конечно, эти режимы могут быть отменены другими квантификаторами, которые могут находиться в шаблонах внутри этих скобок.

Аналогично можно отменить действие модификаторов, если поставить перед ними знак минус. Например:

(?-i:^passport nr\. \d+)

Поиск будет вестись с учетом регистра символов. Или

(?i-ms:^passport nr\. \d+)

Включается модификатор i и отключаются модификаторы m и s.

И в конце добавлю, что скобки, как и другие метасимволы в регулярном выражении, нельзя задать как эскейп-последовательность: \x3a вместо (. Но! Забегая вперед, скажу, что почти произвольные части регулярного выражения могут находиться внутри интерполированных переменных. Смоторите, как это работает:

my $a='('; 'abc' =~ /$a\w)*/; print $1;

На печать выйдет символ c. Этот не описанный в руководствах способ работает потому, что интерполяция переменных в регулярном выражении происходит на ранней стадии обработки, что открывает большие возможности для комбинаций: ведь содержимое этих интерполируемых переменных можно менять от одного обращения к данному оператору поиска/замены - к другому. Например, в зависимости от предыдущих вычислений можно добавить пару захватывающих скобок или изменить квантификатор.




- Начало -  - Назад -  - Вперед -



Книжный магазин