≪
≫

Квантификаторы, их «жадность» и ее ограничение

Ознакомимся с квантификаторами, также именуемыми числителями или повторителями. Если после подшаблона стоит квантификатор, то этот шаблон может повторяться столько раз, сколько указывает этот квантификатор. Например, шаблон а{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}?

 
Посмотреть оригинал