- одиночный символ (возможно, в комбинации с обратным слэшем);

- метасимвол «точка»;

- символьный класс;

- обратная ссылка (о них расскажем позднее);

- подшаблон.

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

x{1,3}

говорит о том, что символ «x» должен повторяться минимум один, а максимум три раза. Соответственно этому шаблону удовлетворяют строки: x, xx, xxx.

Если второй параметр отсутствует, но запятая есть, то повторений может быть сколько угодно. Таким образом,

[aeuoi]{2,}

значит, что любой из символов «a», «e», «u», «o», «i» в строке может повторяться два и более раз, а регулярное выражение

d{3}

задает ровно три цифры.

Сокращенные квантификаторы задают наиболее используемые количественные отношения (повторения). Они придуманы для удобства, чтобы не перегружать и без того сложные выражения лишним синтаксисом.

Исходя из исторических традиций три наиболее часто встречающихся квантификатора имеют следующие обозначения:

* эквивалентно {0,} – то есть это ноль и более повторений;

+ эквивалентно {1,} – то есть это одно и более повторений;

? эквивалентно {0,1} – то есть это ноль или одно повторение.

Есть еще один важный момент, на который стоит обратить внимание при изучении квантификаторов. По умолчанию все квантификаторы «жадные», они стараются захватить как можно больше повторений элемента. То есть если указать, что символ должен повторяться один и более раз (например, с помощью *), совпадение произойдет со строкой, содержащей наибольшее число повторений указанного символа. Это может создать проблемы, например, при попытке выделить комментарии в программе на языке Cи или PHP. Комментарии в Cи и PHP записываются между символами /* и */, внутри которых тоже могут встречаться символы * и /. И попытка выявить Си-комментарии с помощью шаблона

/* .* */

в строке

/* первый комментарий */

не комментарий

/* второй комментарий */

не увенчается успехом из-за «жадности» элемента «.*» (будет найдена также строка «не комментарий»).

Для решения этой проблемы нужно написать знак вопроса после квантификатора. Тогда он перестанет быть «жадным» и попытается захватить как можно меньшее число повторений элемента, к которому он применен (квантификатор применяется к элементу, что стоит перед ним). Так что шаблон

/* .*? */

успешно выделяет Си-комментарии.

В PHP существует опция PCRE_UNGREEDY, которая делает все квантификаторы «не жадными» по умолчанию и «жадными», если после них идет знак вопроса.

<?

//Рассмотрим html-файл, где имеется

//следующая строка:

$str = '<div id=1>Привет</div> '.

'<p>Текст, не заключенный в тег '.

'div</p><div id=2>Пока</div>';

// Если мы хотим найти текст,

// содержащийся между тегами div,

// естественно написать такой шаблон:

$pattern = '!<div id=1>.*</div>!si';

// Но этот шаблон слишком 'жадный'

// и захватит также и текст,

// заключенный в нашем примере между

// тегами <p>. Чтобы этого избежать,

// нужно написать следующий шаблон,

// отличающийся только наличием знака

// вопроса, который запрещает

// квантификатору быть 'жадным'.

$pattern1 = '!<div id=1>.*?</div>!si';

// Запускаем поиск в строке $str

// совпадений с шаблонами

// $pattern и $pattern1

$s = preg_match_all ($pattern, $str,

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату