базовый курс

ГРУППА КУРСА

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

Использование квантификаторов

В регулярном выражении каждый класс стоответствует одному символу. Квантификаторы - это спецсимволы, которые ставятся после класса. Они устанавливают повторение класса. При этом класс находит не один символ, а несколько. Практически он находит строку. Каджый символ в этой строке должен соответствовать классу.

Чаще всего используется квантификатор "+", который устанавливает любое количество повторений. Он работает так:

  • если класс находит подходящий символ, он переходит к следующему символу
  • если и он соответствует классу, то он добавляется в найденную подстроку
  • затем проверяется следующий символ и так до тех пор, пока проверка не дойдёт до символа, не соответствующего классу. Тогда класс заканчивает работу и выполняется следующая часть паттерна.

Найдём в строке указание количества пикселей. Будем искать такую подстроку:

число, а затем "px"

Число может состоять из нескольких цифр, поэтому понадобится квантификатор.

+
9
10
11
let str = 'color: #63A6EA; height: 280px;';
let reg = /\d+px/;
console.log(str.match(reg)); //выведет: 280px

Существуют также следующие квантификаторы:

* - 0 или больше раз. То есть, класс является необязательным. Он может повториться любое количество раз или отсутствовать вообще.

? - 0 или один раз.

Пример:

12
13
14
str = 'аб15вг абвг';
reg = /аб\d*вг/g;
console.log(str.match(reg));

Регулярное выражение ищет такую подстроку:

сначала "аб", затем число, затем "вг"

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

Есть ещё один способ написать квантификатор - указать конкретное число в фигурных скобках.

{2} - ровно 2 символа. Если будет больше или меньше, то совпадения нет.

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

{2,8} - от 2 до 8 символов.

{0,4} - от 0 до 4 символов.

Второе число можно можно не указывать и оставить только запятую. Это значит, что максимальное количество не установлено.

{2,} - два и более символов.

Найдём в тексте слова, в которых больше 8 букв:

15
16
17
str = 'Гепард способен равзивать скорость до 110 километров в час';
reg = /[ёа-я]{9,}/gi;
console.log('<br>'+str.match(reg)); //выведет: развивать,километров

Жадные и ленивые квантификаторы

Часто квантификаторы не устанавливают точное количество повторений, и класс может произвести разное число повторений. Для таких квантификаторов существует два режима работы - жадный и ленивый. Жадный стремится захватить как можно больше символов. Ленивый старается побыстрее передать очередной символ следующей части паттерна и закончить свою работу. По умолчанию установлен жадный режим. Чтобы задать ленивый, нужно после квантификатора поставить знак "?". Его можно поставить после любого квантификатора, в том числе, после "?".

Режим имеет значение, когда символ соответствует и текущему классу и следующей части паттерна.

Жадный режим работает так: если очередной символ соответствует классу, то класс забирает его себе. Класс заканчивает работу только тогда, когда символ не подходит. Тогда начинает работать следующая часть паттерна.

Ленивый режим работает так: даже если символ соответствует классу, то проверяется, не подходит ли символ следующей части паттерна. Если подходит, то класс отдаёт этот символ ей и заканчивает работу. Самый первый найденный символ он не отдаёт.

Пример:

18
19
20
str = '2584name';
console.log('<br>'+str.match(/\d+\w/)); //выведет: 2584n
console.log('<br>'+str.match(/\d+?\w/)); //выведет: 25

В строке 19 регулярное выражение имеет жадный квантификатор. Оно выполняется так:

  • Класс \d находит число 2 и переходит к числу 5
  • Число 5 тоже подходит. Класс забирает его себе, затем забирает 8 и 4 и доходит до буквы "n"
  • Буква "n" не подходит, \d завершает работу
  • Класс \w находит букву "n"
  • У \w нет квантификатора, паттерн выполнен

В строке 20 выражение имеет линивый квантификатор. Он работает так:

  • Класс \d находит число 2 и переходит к числу 5
  • Число 5 подходит, но также оно соответствует \w. Класс \d заканчивает работу
  • Класс \w находит число 5
  • Паттерн выполнен

Бывает так, что жадный квантификатор захватывает все символы до конца строки. А до следующей части паттерна очередь так и не дошла. Тогда происходит откат. Выполнение переходит к следующему классу, и он начинает поиск своего символа, двигаясь от конца строки к началу. Когда он находит свой символ, он забирает его себе, а жадному классу остаётся всё, что до него. Свой первый символ жадный класс не отдаёт. Если следующий класс проверяет всю строку жадного класса и не находит своего символа, значит совпадения нет.

Ленивый режим часто применяется к классу ".". Ведь он захватит всю строку, если его не ограничить и не передать выполнение остальным частям паттерна.