Квантификаторы, их «жадность» и ее ограничение
Ознакомимся с квантификаторами, также именуемыми числителями или повторителями. Если после подшаблона стоит квантификатор, то этот шаблон может повторяться столько раз, сколько указывает этот квантификатор. Например, шаблон а{0,4} соответствует нулю, одной, двум, трем и четырем буквам «а», идущим подряд. Соответствие нулю каких-то символов означает соответствие пустой подстроке. Если максимальный параметр не ограничен, то его можно опустить: шаблон а{1}} соответствует последовательности из одной и более букв «а». Шаблон а{3} соответствует ровно трем подряд буквам , это то же, что и шаблон ааа.
В Perl есть ограничение на максимальное значение квантификатора: 32766. Это связано с тем, что применение квантификаторов требует запоминания состояний, чтобы в последующем в случае неудачи поиска вернуться и попробовать варианты с другим числом повторений. Этот вопрос мы рассмотрим позднее.
Некоторые числители используются так часто, что дія них сделали краткие формы записи:
• а* — это нуль или больше символов а а{0}}
- • а+ — это один или больше символов а: а{1,}
- ? а?— это нуль или один символ а'. а{0,1}.
Квантификаторы имеют высокий приоритет, поэтому шаблон bil+ing соответствует символам />/, после которых идет одна или больше букв / и далее последовательность ing. Если вы хотите, чтобы квантификатор соответствовал последовательности символов или группе подшаблонов, то эту' конструкцию надо взять в скобки:
(bil)+ing
соответствует строкам
biling
bilbiling
bilbilbiling
и т. д.
По умолчанию, алгоритм работы квантификаторов таков, что они пытаются захватить как можно больше текста, который им соответствует. Например, в переменной $texi имеем текст
<Ь>Текст выделен жирным шрифтом.Ь> Простой текст <Ь>Это опять жирныйЬ>
Если применить к этому тексту регулярное выражение .+.
$text =" /<Ь>.+Ь>/
то оно будет соответствовать всему этому тексту, а не фрагменту
<Ь>Текст выделен жирным шрифтом.Ь>
Аналогично, в шаблоне
w*a
примененном к строке
abcabcaaaaa
подшаблон и’* будет соответствовать подстроке abcabcaaaa
(без последней буквы а), а не подстроке
abca
или
abcabca
Имеется способ заставить квантификаторы захватывать как можно меньше текста, для этого после такого квантификатора надо поставить знак вопроса:«?». Например:
а+?
соответствует минимуму из одной и более букв «а». Если этот шаблон применить к строке
bbbaaaabbb
то такой минимальный квантификатор захватит первую попавшуюся букву «, после чего оператор поиска закончит работу; вернув число 7.
В шаблоне
а*?
минимальный квантификатор удовлетворится нулем символов а, а это значит, что совпадение будет найдено в любом месте, даже после истинного конца строки! Оператор
print “а” =' /za*/;
напечатает 7.
Вот другие примеры минимальных квантификаторов:
w?
(abc){3,5}?