Кроме рассмотренных в прошлых статьях специальных классов символов регулярных выражений есть еще одна группа комбинаций, которая указывает, как символы в строке будут повторяться. Такие комбинации еще называют квантификаторами:
*
: соответствует любому количеству повторений или отсутствию последовательности символов
?
: соответствует одному вхождению последовательности символов или ее отсутствию в строке. Например, /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 раз.
Причем здесь также указано, что это должно быть отдельное слово. Для этого вначале указывается символ "^", а в конце символ "$".