Квантификаторы

Квантификаторы в регулярных выражениях используются, когда необходимо указать, что какие-то символы могут повторяться. Например, международный код страны состоит из символа + и от 1 до 4 цифр. Чтобы составить регулярное выражение, которое найдет международные коды стран, необходимо использовать квантификаторы. Например:

/\+\d{1,4}/

Данный шаблон найдет все совпадения с кодами (экранированный плюс, т.к. это метасимвол, и все цифры от 0 до 9, встречающиеся от 1 до 4 раз). Конечно, он еще найдет часть строки из, например: +12345, но это уже тема другой статьи.

Одну из цифр можно опускать, тогда одна из границ не будет указана (либо от нуля: {,4}, либо до бесконечности: {1,} ).

Также можно указать в скобках только одно число, тогда будет искаться только это количество вхождения. Например, следующие два выражения идентичны: /a{3}/ и /aaa/.

Наиболее часто используемые квантификаторы можно заменять на метасимволы:

?
{0,1}
* {0,}
+ {1,}

Символ ?, поставленный после квантификатора, заменяет жадность квантификатора. Жадный квантификатор становится не жадным и наоборот. Жадность определяет, будет ли регулярное выражение соответствовать максимальной или минимальной строке. Проще всего разобраться, используя пример с тегами. Допустим, надо вырезать все теги из строки: <h1>Привет, мир!</h1> и оставить только текст. Если указать такой шаблон:

/<.*>/

то от строки ничего не останется, т.к. регулярное выражение по умолчанию выберет самую длинную подстроку: <h1>Привет, мир!</h1>. Чтобы вырезать только теги, необходимо добавить вопросительный знак после квантификатора:

/<.*?>/

Тогда останется следующая строка: Привет, мир! Знак ? показывает, что надо искать ближайшее совпадение, следующее за ним (в данном случае это символ >) и выбирать эту подстроку.

Знак инвентирования жадности можно использовать и с обычными (скобочными) квантификаторами. Например, необходимо найти все 1- и 2-буквенные теги без атрибутов (такие, как <p>, <b>, <em> и тд). (Я понимаю, что пример высосан из пальца, но большинство статей на эту тему упорно не говорят, а эта особенность может когда-то пригодиться). Регулярное выражение будет выглядеть так:

/<[^\/]{1,2}?>/

Разберем его. Вначале мы указываем, что после символа < может быть любой символ, кроме /, т.к. иначе это закрывающий тег, и к нему не надо ничего добавлять. Затем идет квантификатор, который указывает, что символов должно быть 1 или 2 (не больше, не меньше). После него ? и символ >.

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

02.08.2019