Регулярные выражения js
Содержание:
- Наборы и диапазоны
- Всесильные регулярные выражения и их особенности
- match()
- Регулярные выражения
- JavaScript
- regexp.exec(str)
- matchAll()
- Как создавать простые шаблоны?
- Как создавать сложные шаблоны со специальными символами?
- Полезные методы работы с регулярными выражениями в JavaScript
- Короткие обозначения
- Поиск совпадений: метод exec
- Статичные регэкспы
- Специальные последовательности
- Объект RegExp
- Примеры
- More Examples
- Tip
- Tip
- Regular Expression Search Methods
- Квантификаторы
Наборы и диапазоны
Наборы и диапазоны могут пригодиться, когда нужно указать специальные символы набора или их диапазон.
/* Набор или диапазон - Значение */ - любой один из символов в скобках. — любой символ, за исключением символов в скобках. - любой символ в диапазоне от "a" до "z". - любой символ не из диапазона от "a" до "z".(x) - "x", значение запоминается для дальнейшего использования.(?<name>x) - создание именованной скобочной группы, к которой можно обратиться по указанному имени.(?:x) - "x", значение не запоминается, поэтому совпадение невозможно извлечь из итогового массива элементов.
Примеры:
// - Любой один из символов в скобках.const myPattern = //console.log(myPattern.test('aei'))// true (есть a, e, i)console.log(myPattern.test('form'))// false (нет a, e или i)// - Любой символ, за исключением символов в скобках.const myPattern = //console.log(myPattern.test('aei'))// false (нет других символов, кроме a, e и i)console.log(myPattern.test('form'))// true (есть другие символы, кроме a, e и i)// - Любой символ в диапазоне от "a" до "z".const myPattern = //console.log(myPattern.test('bcd'))// true (есть символы в диапазоне от 'b' до 'g')console.log(myPattern.test('jklm'))// false (нет символов в диапазоне от 'b' до 'g')// - Любой символ не из диапазона от "a" до "z".const myPattern = //console.log(myPattern.test('bcd'))// false (нет других символов, кроме входящих в диапазон от 'b' до 'g')console.log(myPattern.test('jklm'))// true (есть другие символы, кроме входящих в диапазон от 'b' до 'g')// (x) - "x", значение запоминается для дальнейшего использования.const myPattern = /(na)da\1/console.log(myPattern.test('nadana'))// true - \1 запоминает и использует совпадение 'na' из первого выражения в скобках.console.log(myPattern.test('nada'))// false// (?<name>x) - Создание именованной скобочной группы, к которой можно обратиться по указанному имени.const myPattern = /(?<foo>is)/console.log(myPattern.test('Work is created.'))// trueconsole.log(myPattern.test('Just a text'))// false// (?:x) - "x", значение не запоминается.const myPattern = /(?:war)/console.log(myPattern.test('warsawwar'))// trueconsole.log(myPattern.test('arsaw'))// false
Всесильные регулярные выражения и их особенности
А более опытный разработчик поймет, что данное выражение проверяет введенное мыло на корректность. Таким образом, в написанном должна быть почта, состоящее из цифр, букв, знака тире и/или нижнего подчеркивания, после обязательно должен присутствовать один знак собачки, за которым следуют буквы, тире и цифры, а далее точка и от двух до шести символов.
Это и есть основная отличительная черта регулярных выражений. Они абсолютно не похожи ни на какие известные вам ранее средства программирования.
Итак, регулярные выражение по-простому можно назвать образцом, шаблоном, по которому идет сопоставление символов в строках. Благодаря им можно производить поиск, проверку и замену строковых значений.
Главным их преимуществом является удобный способ записи универсальных формул проверки значений.
Вот пример тестирования на валидность мобильного номера вида (+ХХХХХХХХХХХХ):
Также с помощью шаблонов можно производить поиск совпадений слов/выражений в тексте с искомым значением.
match()
— второй метод объекта String, который позволяет использовать регулярные выражения. Он работает аналогично : при нахождении совпадения метод возвращает массив с информацией об использованном шаблоне, позиции в строке, на которой было найдено совпадение, проверяемом тексте и наборах.
Так же как и , возвращает при отсутствии совпадений. При использовании метода с флагом для поиска всех совпадений с шаблоном возвращается массив из всех совпадений.
// Синтаксис метода match()// 'проверяемый текст'.match(/шаблон/)// Создание текста для проверкиconst myString = 'The world of code is not full of code.'// Описание шаблонаconst myPattern = /code/// Использование match() для поиска совпадения в текстеmyString.match(myPattern)// [// 'code',// index: 13,// input: 'The world of code is not full of code.',// groups: undefined// ]'Another day in the life.'.match(myPattern)// null// Использование match() для поиска всех совпадений// Создание текста для проверкиconst myString = 'The world of code is not full of code.'// Описание шаблонаconst myPattern = /code/g // добавление флага 'g'// Использование match() для поиска совпадения в текстеmyString.match(myPattern)//
Регулярные выражения
Регулярное выражение (оно же «регэксп», «регулярка» или просто «рег»), состоит из шаблона (также говорят «паттерн») и необязательных флагов.
Существует два синтаксиса для создания регулярного выражения.
«Длинный» синтаксис:
…И короткий синтаксис, использующий слеши :
Слеши говорят JavaScript о том, что это регулярное выражение. Они играют здесь ту же роль, что и кавычки для обозначения строк.
Регулярное выражение в обоих случаях является объектом встроенного класса .
Основная разница между этими двумя способами создания заключается в том, что слеши не допускают никаких вставок переменных (наподобие возможных в строках через ). Они полностью статичны.
Слеши используются, когда мы на момент написания кода точно знаем, каким будет регулярное выражение – и это большинство ситуаций. А – когда мы хотим создать регулярное выражение «на лету» из динамически сгенерированной строки, например:
JavaScript
JS Массивы
concat()
constructor
copyWithin()
entries()
every()
fill()
filter()
find()
findIndex()
forEach()
from()
includes()
indexOf()
isArray()
join()
keys()
length
lastIndexOf()
map()
pop()
prototype
push()
reduce()
reduceRight()
reverse()
shift()
slice()
some()
sort()
splice()
toString()
unshift()
valueOf()
JS Булевы
constructor
prototype
toString()
valueOf()
JS Классы
constructor()
extends
static
super
JS Даты
constructor
getDate()
getDay()
getFullYear()
getHours()
getMilliseconds()
getMinutes()
getMonth()
getSeconds()
getTime()
getTimezoneOffset()
getUTCDate()
getUTCDay()
getUTCFullYear()
getUTCHours()
getUTCMilliseconds()
getUTCMinutes()
getUTCMonth()
getUTCSeconds()
now()
parse()
prototype
setDate()
setFullYear()
setHours()
setMilliseconds()
setMinutes()
setMonth()
setSeconds()
setTime()
setUTCDate()
setUTCFullYear()
setUTCHours()
setUTCMilliseconds()
setUTCMinutes()
setUTCMonth()
setUTCSeconds()
toDateString()
toISOString()
toJSON()
toLocaleDateString()
toLocaleTimeString()
toLocaleString()
toString()
toTimeString()
toUTCString()
UTC()
valueOf()
JS Ошибка
name
message
JS Булевы
decodeURI()
decodeURIComponent()
encodeURI()
encodeURIComponent()
escape()
eval()
Infinity
isFinite()
isNaN()
NaN
Number()
parseFloat()
parseInt()
String()
undefined
unescape()
JS JSON
parse()
stringify()
JS Математика
abs()
acos()
acosh()
asin()
asinh()
atan()
atan2()
atanh()
cbrt()
ceil()
cos()
cosh()
E
exp()
floor()
LN2
LN10
log()
LOG2E
LOG10E
max()
min()
PI
pow()
random()
round()
sin()
sqrt()
SQRT1_2
SQRT2
tan()
tanh()
trunc()
JS Числа
constructor
isFinite()
isInteger()
isNaN()
isSafeInteger()
MAX_VALUE
MIN_VALUE
NEGATIVE_INFINITY
NaN
POSITIVE_INFINITY
prototype
toExponential()
toFixed()
toLocaleString()
toPrecision()
toString()
valueOf()
JS ОператорыJS Рег.Выражения
constructor
compile()
exec()
g
global
i
ignoreCase
lastIndex
m
multiline
n+
n*
n?
n{X}
n{X,Y}
n{X,}
n$
^n
?=n
?!n
source
test()
toString()
(x|y)
.
\w
\W
\d
\D
\s
\S
\b
\B
\0
\n
\f
\r
\t
\v
\xxx
\xdd
\uxxxx
JS Заявления
break
class
continue
debugger
do…while
for
for…in
for…of
function
if…else
return
switch
throw
try…catch
var
while
JS Строки
charAt()
charCodeAt()
concat()
constructor
endsWith()
fromCharCode()
includes()
indexOf()
lastIndexOf()
length
localeCompare()
match()
prototype
repeat()
replace()
search()
slice()
split()
startsWith()
substr()
substring()
toLocaleLowerCase()
toLocaleUpperCase()
toLowerCase()
toString()
toUpperCase()
trim()
valueOf()
regexp.exec(str)
Метод ищет совпадение с в строке . В отличие от предыдущих методов, вызывается на регулярном выражении, а не на строке.
Он ведёт себя по-разному в зависимости от того, имеет ли регулярное выражение флаг .
Если нет , то возвращает первое совпадение в точности как . Такое поведение не даёт нам ничего нового.
Но если есть , то:
- Вызов возвращает первое совпадение и запоминает позицию после него в свойстве .
- Следующий такой вызов начинает поиск с позиции , возвращает следующее совпадение и запоминает позицию после него в .
- …И так далее.
- Если совпадений больше нет, то возвращает , а для устанавливается значение .
Таким образом, повторные вызовы возвращают одно за другим все совпадения, используя свойство для отслеживания текущей позиции поиска.
В прошлом, до появления метода в JavaScript, вызов в цикле использовали для получения всех совпадений с их позициями и группами скобок в цикле:
Это работает и сейчас, хотя для современных браузеров , как правило, удобнее.
Мы можем использовать для поиска совпадения, начиная с нужной позиции, если вручную поставим .
Например:
Если у регулярного выражения стоит флаг , то поиск будет вестись не начиная с позиции , а только на этой позиции (не далее в тексте).
В примере выше заменим флаг на . Ничего найдено не будет, поскольку именно на позиции слова нет:
Это удобно в тех ситуациях, когда мы хотим «прочитать» что-то из строки по регулярному выражению именно на конкретной позиции, а не где-то далее.
matchAll()
Подобно методу , возвращает все совпадения при использовании флага в шаблоне. Однако работает он по-другому. Метод возвращает объект . Есть несколько способов извлечь из него все совпадения.
Во-первых, можно пройтись по объекту циклом и вернуть или записать все совпадения. Также можно использовать , чтобы создать массив из содержимого объекта, или оператор spread, который даст точно такой же результат, как и .
// Синтаксис метода match()// ‘проверяемый текст’.match(/шаблон/)// Создание текста для проверкиconst myString = ‘The world of code is not full of code.’// Описание шаблонаconst myPattern = /code/g// Обратите внимание, что используется флаг ‘g’// Использование matchAll() для поиска совпадений в текстеconst matches = myString.matchAll(myPattern)// Использование цикла for…of для получения всех совпаденийfor (const match of matches) { console.log(match)}// [// [// ‘code’,// index: 13,// input: ‘The world of code is not full of code.’,// groups: undefined// ],// [// ‘code’,// index: 33,// input: ‘The world of code is not full of code.’,// groups: undefined// ]// ]// Использование Array.from() для получения всех совпаденийconst matches = Array.from(myString.matchAll(myPattern))// [// [// ‘code’,// index: 13,// input: ‘The world of code is not full of code.’,// groups: undefined// ],// [// ‘code’,// index: 33,// input: ‘The world of code is not full of code.’,// groups: undefined// ]// ]// Использование оператора spread для получения всех совпаденийconst matches = // [// [// ‘code’,// index: 13,// input: ‘The world of code is not full of code.’,// groups: undefined// ],// [// ‘code’,// index: 33,// input: ‘The world of code is not full of code.’,// groups: undefined// ]// ]
Как создавать простые шаблоны?
Вы узнали, как создавать и использовать регулярные выражения. Теперь давайте рассмотрим процесс создания шаблонов. Простейший способ составлять регулярные выражения —применение простых шаблонов. Это значит, что необходимо создать строку с особым текстом, а затем проверить, имеет ли какая-то другая строка совпадения с этим текстом.
// Создание простого шаблона// с использованием литерала регулярного выраженияconst myPattern = /JavaScript/// Проверка строки на совпадения с шаблономmyPattern.test('One of the most popular languages is also JavaScript.')// true// Проверка строки на совпадения с шаблономmyPattern.test('What happens if you combine Java with scripting?')// false
Как создавать сложные шаблоны со специальными символами?
До сих пор мы использовали регулярные выражения из простых шаблонов. Их может быть достаточно для каких-то простых задач. Однако для сложных случаев такие выражения не подойдут. Настало время создавать и использовать более сложные шаблоны. Здесь в игру вступают специальные символы. Давайте рассмотрим те из них, которые наиболее часто используются в регулярных выражениях.
Полезные методы работы с регулярными выражениями в JavaScript
Регулярные выражения, создаваемые с использованием флагов и последовательностей символов, которые мы обсуждали ранее в этой статье, предназначены для использования с различными методами JavaScript для поиска, замены или разделения строк.
Вот некоторые методы, связанные с регулярными выражениями.
► test() – проверяет, содержит ли основная строка подстроку, которая соответствует шаблону, заданному данным регулярным выражением. При успешном совпадении метод возвращает true, в противном случае — false.
JavaScript
var textA = 'I like APPles very much'; var textB = 'I like APPles'; var regexOne = /apples$/i // вернет false console.log(regexOne.test(textA)); // вернет true console.log(regexOne.test(textB));
В приведённом выше примере приведено регулярное выражение, предназначенное для поиска слова “apples” в случае, если оно расположено в конце строки. Поэтому в первом случае метод вернет false.
► search() – проверяет, содержит ли основная строка подстроку, которая соответствует шаблону, заданному данным регулярным выражением. Метод возвращает индекс совпадения при успехе и -1 в противном случае.
JavaScript
var textA = 'I like APPles very much'; var regexOne = /apples/; var regexTwo = /apples/i; // Результат: -1 console.log(textA.search(regexOne)); // Результат: 7 console.log(textA.search(regexTwo));
В данном примере проверка по превому регулярному выражению вернет -1, потому что не указан флаг нечувствительности к регистру.
► match() – осуществляет поиск подстроки в основной строке. Подстрока должна соответствовать шаблону, заданному данным регулярным выражением. Если используется флаг g, то несколько совпадений будут возвращены в виде массива.
JavaScript
var textA = 'All I see here are apples, APPles and apPleS'; var regexOne = /apples/gi; // Результат: console.log(textA.match(regexOne));
► exec() – производит поиск подстроки в основной строке. В случае, если подстрока соответствует шаблону, заданному данным регулярным выражением, возвращает массив с результатами или null. В свойстве input хранится оригинальная строка
JavaScript
var textA = 'Do you like apples?'; var regexOne = /apples/; // Результат: apples console.log(regexOne.exec(textA)); // Результат : Do you like apples? console.log(regexOne.exec(textA).input);
► replace() – ищет подстроку, соответствующую заданному шаблону и заменяет ее на предоставленную заменяющую строку.
JavaScript
var textA = 'Do you like aPPles?'; var regexOne = /apples/i // Результат: Do you like mangoes? console.log(textA.replace(regexOne, 'mangoes'));
► split() – Этот метод позволит вам разбить основную строку на подстроки на основе разделителя, представленного в виде регулярного выражения.
JavaScript
var textA = 'This 593 string will be brok294en at places where d1gits are.'; var regexOne = /\d+/g // Результат : console.log(textA.split(regexOne))
Короткие обозначения
Для самых востребованных квантификаторов есть сокращённые формы записи:
-
Означает «один или более». То же самое, что и .
Например, находит числа (из одной или более цифр):
-
Означает «ноль или один». То же самое, что и . По сути, делает символ необязательным.
Например, шаблон найдёт после которого, возможно, следует , а затем .
Поэтому шаблон найдёт два варианта: и :
-
Означает «ноль или более». То же самое, что и . То есть символ может повторяться много раз или вообще отсутствовать.
Например, шаблон находит цифру и все нули за ней (их может быть много или ни одного):
Сравните это с (один или более):
Поиск совпадений: метод exec
Метод возвращает массив и ставит свойства регулярного выражения.
Если совпадений нет, то возвращается null.
Например,
// Найти одну d, за которой следует 1 или более b, за которыми одна d // Запомнить найденные b и следующую за ними d // Регистронезависимый поиск var myRe = /d(b+)(d)/ig; var myArray = myRe.exec("cdbBdbsbz");
В результате выполнения скрипта будут такие результаты:
Объект | Свойство/Индекс | Описания | Пример |
Содержимое . | |||
Индекс совпадения (от 0) | |||
Исходная строка. | |||
Последние совпавшие символы | |||
Совпадения во вложенных скобках, если есть. Число вложенных скобок не ограничено. | |||
Индекс, с которого начинать следующий поиск. | |||
Показывает, что был включен регистронезависимый поиск, флаг «». | |||
Показывает, что был включен флаг «» поиска совпадений. | |||
Показывает, был ли включен флаг многострочного поиска «». | |||
Текст паттерна. |
Если в регулярном выражении включен флаг «», Вы можете вызывать метод много раз для поиска последовательных совпадений в той же строке. Когда Вы это делаете, поиск начинается на подстроке , с индекса . Например, вот такой скрипт:
var myRe = /ab*/g; var str = "abbcdefabh"; while ((myArray = myRe.exec(str)) != null) { var msg = "Found " + myArray + ". "; msg += "Next match starts at " + myRe.lastIndex; print(msg); }
Этот скрипт выведет следующий текст:
Found abb. Next match starts at 3 Found ab. Next match starts at 9
В следующем примере функция выполняет поиск по input. Затем делается цикл по массиву, чтобы посмотреть, есть ли другие имена.
Предполагается, что все зарегистрированные имена находятся в массиве А:
var A = ; function lookup(input) { var firstName = /\w+/i.exec(input); if (!firstName) { print(input + " isn't a name!"); return; } var count = 0; for (var i = 0; i < A.length; i++) { if (firstName.toLowerCase() == A.toLowerCase()) count++; } var midstring = (count == 1) ? " other has " : " others have "; print("Thanks, " + count + midstring + "the same name!") }
Статичные регэкспы
В некоторых реализациях javascript регэкспы, заданные коротким синтаксисом /…/ — статичны. То есть, такой объект создается один раз в некоторых реализациях JS, например в Firefox. В Chrome все ок.
function f() { // при многократных заходах в функцию объект один и тот же var re = /lalala/ }
По стандарту эта возможность разрешена ES3, но запрещена ES5.
Из-за того, что при глобальном поиске меняется, а сам объект регэкспа статичен, первый поиск увеличивает , а последующие — продолжают искать со старого , т.е. могут возвращать не все результаты.
При поиске всех совпадений в цикле проблем не возникает, т.к. последняя итерация (неудачная) обнуляет .
Специальные последовательности
Специальные последовательности упрощают написание часто используемых шаблонов. Вот список специальных последовательностей:
— Соответствует, если указанные символы находятся в начале строки.
Выражение | Строка | Совпадения |
---|---|---|
Совпадает | ||
Не совпадает |
— Соответствует, если указанные символы находятся в начале или в конце слова.
Выражение | Строка | Совпадения |
---|---|---|
Совпадает | ||
Совпадает | ||
Не совпадает | ||
Совпадает | ||
Совпадает | ||
Не совпадает |
— противоположность . Соответствует, если указанные символы НЕ находятся в начале или конце слова.
Выражение | Строка | Совпадения |
---|---|---|
Не совпадает | ||
Не совпадает | ||
Совпадает | ||
Не совпадает | ||
Не совпадает | ||
Совпадает |
— Соответствует любой десятичной цифре. Эквивалентно
Выражение | Строка | Совпадения |
---|---|---|
3 совпадения (в ) | ||
Не совпадает |
— Соответствует любой не десятичной цифре. Эквивалентно
Выражение | Строка | Совпадения |
---|---|---|
3 совпадения (в ) | ||
Не совпадает |
— Соответствует строкам, содержащим любой пробельный символ. Эквивалентно .
Выражение | Строка | Совпадения |
---|---|---|
1 Совпадает | ||
Не совпадает |
— Соответствует строкам, содержащим любой непробельный символ. Эквивалентно .
Выражение | Строка | Совпадения |
---|---|---|
2 совпадения (в ) | ||
Не совпадает |
— Соответствует любому буквенно-цифровому символу (цифрам и алфавитам). Эквивалентно . Кстати, подчеркивание тоже считается буквенно-цифровым символом.
Выражение | Строка | Совпадения |
---|---|---|
3 совпадения (в ) | ||
Не совпадает |
— Соответствует любому не буквенно-цифровому символу. Эквивалентно
Выражение | Строка | Совпадения |
---|---|---|
1 Совпадает (в ) | ||
Не совпадает |
— Соответствует, если указанные символы находятся в конце строки.
Выражение | Строка | Совпадения |
---|---|---|
1 Совпадает | ||
Не совпадает | ||
Не совпадает |
Теперь вы понимаете основы регаулярных выражений, давайте обсудим, как использовать регулярные выражения в вашем коде JavaScript.
Объект RegExp
Объект типа , или, короче, регулярное выражение, можно создать двумя путями
/pattern/флаги new RegExp("pattern")
— регулярное выражение для поиска (о замене — позже), а флаги — строка из любой комбинации символов (глобальный поиск), (регистр неважен) и (многострочный поиск).
Первый способ используется часто, второй — иногда. Например, два таких вызова эквивалентны:
var reg = /ab+c/i var reg = new RegExp("ab+c", "i")
При втором вызове — т.к регулярное выражение в кавычках, то нужно дублировать
// эквивалентны re = new RegExp("\\w+") re = /\w+/
При поиске можно использовать большинство возможностей современного PCRE-синтаксиса.
Примеры
Разберём скобки на примерах.
Без скобок шаблон означает символ и идущий после него символ , который повторяется один или более раз. Например, или .
Скобки группируют символы вместе. Так что означает , , и т.п.
Сделаем что-то более сложное – регулярное выражение, которое соответствует домену сайта.
Например:
Как видно, домен состоит из повторяющихся слов, причём после каждого, кроме последнего, стоит точка.
На языке регулярных выражений :
Поиск работает, но такому шаблону не соответствует домен с дефисом, например, , так как дефис не входит в класс .
Можно исправить это, заменим на везде, кроме как в конце: .
Итоговый шаблон:
More Examples
Using the RegExp function exec():
let text = «Is this all there is?»;
let pattern = /is/g;
let result = pattern.exec(text);
Using the RegExp function test():
let pattern = /is/g;
let result = pattern.test(text);
Using the String function match():
let pattern = /is/g;
let result = text.march(pattern);
Tip
For a global, case-insensitive search, use the «i» modifier together with the g modifier.
A global, case-insensitive search for «is»:
Using the RegExp function exec():
let text = «Is this all there is?»;
let result = /is/gi.exec(text);
Using the RegExp function test():
let text = «Is this all there is?»;
let result = /is/gi.test(text);
Using the String function match():
let text = «Is this all there is?»;
let result = text.match(/is/gi);
Tip
You can use the global property to check if the g modifier is set.
Example
let pattern = /W3S/g;
let result = pattern.global;
Regular Expression Search Methods
In JavaScript, a regular expression text search, can be done with different methods.
With pattern as a regular expression, these are the most common methods:
Example | Description |
---|---|
text.match(pattern) | The String method match() |
text.search(pattern) | The String method search() |
pattern.exec(text) | The RexExp method exec() |
pattern.test(text) | The RegExp method test() |
❮ Previous
JavaScript RegExp Object
Next ❯
Квантификаторы
Квантификаторы используются, когда необходимо указать количество символов или выражений, по которым производится сопоставление.
/* Квантификатор - Значение */* - 0 или более совпадений с предшествующим выражением.+ - 1 или более совпадений с предшествующим выражением.? - Предшествующее выражение необязательно (то есть совпадений 0 или 1).x{n} - "n" должно быть целым положительным числом. Количество вхождений предшествующего выражения "x" равно "n".x{n, } - "n" должно быть целым положительным числом. Количество вхождений предшествующего выражения "x" равно, как минимум, "n".x{n, m} - "n" может быть равно 0 или целому положительному числу. "m" - целое положительное число. Если "m" > "n", количество вхождений предшествующего выражения "x" равно минимум "n" и максимум "m".
Примеры:
// * - 0 или более совпадений с предшествующим выражениемconst myPattern = /bo*k/console.log(myPattern.test('b'))// falseconsole.log(myPattern.test('bk'))// trueconsole.log(myPattern.test('bok'))// true// + - 1 или более совпадений с предшествующим выражениемconst myPattern = /\d+/console.log(myPattern.test('word'))// falseconsole.log(myPattern.test(13))// true// ? - Предшествующее выражение необязательно, совпадений 0 или 1const myPattern = /foo?bar/console.log(myPattern.test('foobar'))// trueconsole.log(myPattern.test('fooobar'))// false// x{n} - Количество вхождений предшествующего выражения "x" равно "n"const myPattern = /bo{2}m/console.log(myPattern.test('bom'))// falseconsole.log(myPattern.test('boom'))// trueconsole.log(myPattern.test('booom'))// false// x{n, } - Количество вхождений предшествующего выражения "x" равно, как минимум, "n"const myPattern = /do{2,}r/console.log(myPattern.test('dor'))// falseconsole.log(myPattern.test('door'))// trueconsole.log(myPattern.test('dooor'))// true// x{n, m} - Количество вхождений предшествующего выражения "x" равно минимум "n" и максимум "m"const myPattern = /zo{1,3}m/console.log(myPattern.test('zom'))// falseconsole.log(myPattern.test('zoom'))// trueconsole.log(myPattern.test('zooom'))// trueconsole.log(myPattern.test('zoooom'))// false