Квантификаторы
Квантификаторы в регулярных выражениях используются, когда необходимо указать, что какие-то символы могут повторяться. Например, международный код страны состоит из символа + и от 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 (не больше, не меньше). После него ? и символ >.
Это самое необходимое, что надо знать про квантификаторы в регулярных выражениях.