Квантификаторы в регулярных выражениях

Последнее обновление: 27.10.2023

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

  • *: соответствует любому количеству повторений или отсутствию последовательности символов

  • ?: соответствует одному вхождению последовательности символов или ее отсутствию в строке. Например, /h?ome/ соответствует подстрокам "home" и "ome".

  • +: соответствует одному и более повторений последовательности символов

  • {n}: соответствует n-ому количеству повторений предыдущего символа. Например, h{3} соответствует подстроке "hhh"

  • {n,}: соответствует n и более количеству повторений предыдущего символа. Например, h{3,} соответствует подстрокам "hhh", "hhhh", "hhhhh" и т.д.

  • {n,m}: соответствует от n до m повторений предыдущего символа. Например, h{2, 4} соответствует подстрокам "hh", "hhh", "hhhh".

Необязательные символы

Номер телефона может иметь дефисы для разделения отдельных блоков цифр, например, "+1-234-567-8901", а может не иметь разделителей, например, "12345678901". То есть в данном случае дефисы-разделители необязательны. И мы можем отразить это с помощью квантификатора ?

const exp = /\d-?\d\d\d-?\d\d\d-?\d\d\d\d/; 

const phone1 = "+1-234-567-8901";
const phone2 = "12345678901";
const phone3 = "1-2345678901";
console.log(exp.test(phone1));   // true
console.log(exp.test(phone2));   // true
console.log(exp.test(phone3));   // true

Здесь "-?" отражает, что символ "-" может быть необязательным, однако если он присутствует, то только один раз.

Произвольное количество символов

Символ * указывает, что предыдущий символ может встречаться произвольное число раз (в том числе 0 раз). Например:

const exp = /;*/;    // соответствует любому количеству символов ;

const str1 = "number1 = 3";
const str2 = "number2 = 4;";
const str3 = "number3 = 5;;;";
console.log(exp.test(str1));   // true
console.log(exp.test(str2));   // true
console.log(exp.test(str3));   // true

Регулярное выражение /;*/ указывает, что точка с запятой (;) может встречаться 1 и более раз, либо может вообще не встречаться.

Символ встречается как минимум один раз

Квантификатор + указывает, что предыдущий символ может встречаться один или большее количество раз. Например:

const exp = /;+/;    // соответствует 1 и более символов ;

const str1 = "number1 = 3";
const str2 = "number2 = 4;";
const str3 = "number3 = 5;;;";
console.log(exp.test(str1));   // false
console.log(exp.test(str2));   // true
console.log(exp.test(str3));   // true

Регулярное выражение /;+/ указывает, что точка с запятой (;) может встречаться как минимум 1 раз (или большее количество раз).

Точное количество вхождений

Квантификатор {n} позволяет определить точное количество повторений предыдущего символа через значение n. Например, для определения телефонного номера может использоваться выражение /\d\d\d\d\d\d\d\d\d\d\d/ - 11 цифр подряд. Однако оно неоптимально. И для его сокращения мы можем использовать другое выражение: /\d{11}/ - символ "\d" (цифровой символ) встречается 11 раз подряд. Например:

const exp = /\d{11}/; 

const phone1 = "+12345678901";
const phone2 = "1-2345678901";
const phone3 = "12345678901";
console.log(exp.test(phone1));   // true
console.log(exp.test(phone2));   // false
console.log(exp.test(phone3));   // true

Но что, если блоки цифр у нас разделены разделителем-дефисом типа "+1-234-567-8901". В этот случае мы могли бы задать длину для каждого блока: /\d-\d{3}-\d{3}-\d{4}/. Например:

const exp = /\d-\d{3}-\d{3}-\d{4}/; 

const phone1 = "+12345678901";
const phone2 = "1-234-567-8901";
const phone3 = "12345678901";
console.log(exp.test(phone1));   // false
console.log(exp.test(phone2));   // true
console.log(exp.test(phone3));   // false

Комбинируя с другими квантификаторами, можно сделать разделители-дефисы необязательными:

const exp = /\d-?\d{3}-?\d{3}-?\d{4}/; 

const phone1 = "+12345678901";
const phone2 = "1-234-567-8901";
const phone3 = "1-2345678901";
console.log(exp.test(phone1));   // true
console.log(exp.test(phone2));   // true
console.log(exp.test(phone3));   // true

Определение минимального количества вхождений

Квантификатор {n,} позволяет задать через n минимальное количество вхождений. Допустим, у нас пароли должны иметь как минимум 8 символов:

const exp = /\w{8,}/; 

const code1 = "1234567890";
const code2 = "qwery5";
const code3 = "password123";
console.log(exp.test(code1));   // true
console.log(exp.test(code2));   // false
console.log(exp.test(code3));   // true

Метасимвол "\w" соответствует любому цифровому и алфавитному символу или символу подчеркивания. Соответственно выражение /\w{8,}/ соответствует строкам, где есть подстрока из как минимум 8 таких символов.

Определение минимального и максимального количества вхождений

Квантификатор {n,m} позволяет определить одновременно минимальное (n) и максимальное (m) количество повторений. Например, мы хотим, чтобы имена у нас были не слишком короткими, скажем, не меньше 3 символов, и не слишком длинными (например, не больше 10 символов):

const exp = /^[a-zA-Z]{3,10}$/; 

const code1 = "Tom";
const code2 = "Li";
const code3 = "Maximilianus";
console.log(exp.test(code1));   // true
console.log(exp.test(code2));   // false
console.log(exp.test(code3));   // false

Выражение /^[a-zA-Z]{3,10}$/ говорит, что любой символ из диапазонов "a-z" и "A-Z" должен повторяться не меньше 3 раз и не больше 10 раз. Причем здесь также указано, что это должно быть отдельное слово. Для этого вначале указывается символ "^", а в конце символ "$".

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850