Простые квантификаторы

Часто возникает необходимость в повторении некоторых частей шаблона. Звездочка (*) означает нуль или более повторений предшествующего элемента. Таким образом, шаблон /fred\t*barney/ совпадет при любом количестве символов табуляции между fred и barney: и "fred\tbarney" с одним символом табуляции, и "fred\t\tbarney" с двумя табуляциями, и "fred\t\t\tbarney" с тремя символами табуляции, и даже с "fredbarney" без табуляции. Дело в том, что * означает «нуль и более» – хоть пятьсот символов табуляции, но ничего, кроме них. Возможно, вам будет удобнее запомнить смысл * в формулировке «предыдущий элемент, повторенный сколько угодно раз, даже нуль» (по аналогии с оператором умножения, который в программировании тоже записывается знаком *).

А если в совпадение должны включаться другие символы кроме табуляции? Точка совпадает с любым символом1, поэтому .* совпадет с любым символом, повторенным сколько угодно раз. Таким образом, шаблон /fred.*barney/ совпадет с fred и barney, разделенными любым «мусором». Любая строка, в которой присутствуют строки fred и (где-то потом) barney, совпадет с этим шаблоном. Мы часто называем шаблон .* «мусором», потому что он совпадает с любой последовательностью символов в строке.


Звездочка обычно называется квантификатором, то есть определителем количества повторений предыдущего элемента. Но это не единственный квантификатор; есть и другой – плюс (+), обозначающий одно или более повторений предшествующего элемента: /fred +barney/ совпадает, если fred отделяется от barney пробелами (и ничем, кроме пробелов!). Сам пробел метасимволом не является. Совпадение в строке fredbarney найдено не будет, потому что плюс требует присутствия одного и более пробелов, так что хотя бы один пробел обязателен.

Возможно, вам будет удобнее запомнить смысл + в формулировке «последний элемент, плюс (не обязательно) повторенный сколько угодно раз». Также существует третий квантификатор, схожий с * и +, но более специализированный. Вопросительный знак (?) означает, что предшествующий элемент не является обязательным. Другими словами, он может встречаться один раз или не встречаться вовсе. Как и два других квантификатора, вопросительный знак указывает на вхождение предшествующего элемента некоторое количество раз. Просто в данном случае элемент может совпадать один раз (он есть) или нуль раз (его нет). Других возможностей нет. Таким образом, /bamm-?bamm/ совпадает с одним из двух вариантов написания: bamm-bamm или bammbamm. Запомнить его несложно; вопросительный знак фактически говорит: «Предшествующий элемент, он есть? Или его нет?» Все три квантификатора должны следовать за каким-либо элементом, так как все они определяют количество повторений предшествующего элемента.

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

Статьи из раздела Perl на эту тему:
Альтернатива
Группировка в шаблонах
Инвертированные сокращения
О метасимволах
Простые регулярные выражения

Вернуться в раздел: Perl / 6. В мире регулярных выражений