Регулярные выражения: первое знакомство
Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.
Регулярное выражение — маленький язык внутри JavaScript, на котором описывают форму текста: «четыре цифры, дефис, две цифры». Разберёмся, из чего он собран, и научимся не только писать шаблоны, но и читать чужие.
Строку часто нужно не просто прочитать целиком, а разобрать: вытащить все числа, убедиться, что код состоит ровно из шести цифр, переставить части даты. Через indexOf и циклы это решается, но код быстро зарастает условиями и счётчиками.
Регулярное выражение — это шаблон, по которому движок сам пробегает строку и отвечает: совпадение есть или нет, а если есть — то какое именно. Сравните два способа собрать цифры из текста.
Регулярка записывается между косыми чертами: /кот/. Это обычное значение языка — его можно положить в переменную, передать в функцию, вызвать у него метод.
Сразу за закрывающей чертой идут флаги — буквы, меняющие правила поиска. i убирает разницу между строчными и прописными, g просит найти все совпадения, а не только первое, m заставляет якоря ^ и $ срабатывать на каждой строке текста, а не только на его краях.
Разницу от флага m видно только на многострочном тексте.
Если шаблон собирается из данных на ходу, литерал не подойдёт — тогда берут конструктор: new RegExp("\\d+", "g"). Внутри строки обратный слэш приходится удваивать, поэтому литерал читается лучше и встречается чаще.
Два метода закрывают большую часть задач. regexp.test(str) отвечает true или false — он нужен, когда важен сам факт совпадения. str.match(regexp) возвращает то, что нашлось.
Поведение match зависит от флага g: без него вернётся массив-результат, где нулевой элемент — само совпадение, а дальше идут скобочные группы; с g — простой массив всех найденных кусков. А если не нашлось ничего, будет null, а не пустой массив — об это спотыкаются все без исключения.
Поэтому результат match подстраховывают сразу, а не там, где всё сломается.
Шаблон редко состоит из конкретных букв — обычно нужно «любая цифра» или «любой пробел». Для этого есть классы символов. Учтите сразу: \w знает только латиницу, кириллица под него не подпадает — для неё пишут явный диапазон [а-яё].
| Запись | Что совпадает | Пример |
|---|---|---|
| \d | цифра от 0 до 9 | 7 |
| \w | латинская буква, цифра или подчёркивание | a, 7, _ |
| \s | пробел, табуляция, перевод строки | пробел |
| . | любой символ, кроме перевода строки | я |
| [а-яё] | любой символ из набора | ё |
| [^0-9] | любой символ, кроме перечисленных | к |
Квантификатор говорит, сколько раз повторяется то, что стоит перед ним: + — один раз и больше, * — ноль и больше, ? — ноль или один (то есть «необязательно»), {3} — ровно три, {2,4} — от двух до четырёх, {2,} — от двух и сколько угодно.
Квантификаторы жадные: + и * забирают максимум, а отступают назад, только если иначе шаблон не сойдётся. Вопросительный знак после квантификатора делает его ленивым — брать минимум.
Якоря не совпадают с символами — они обозначают позицию. ^ — начало, $ — конец. Связка ^...$ читается как «вся строка целиком подходит под шаблон», и это основа любой проверки формата.
Круглые скобки делают два дела сразу: группируют кусок шаблона, чтобы квантификатор относился ко всей группе, и запоминают совпавший текст. Захваченное лежит в результате match под номерами — [1], [2] и дальше по порядку открывающих скобок, а в [0] — всё совпадение целиком.
Номера легко перепутать, особенно когда в шаблон добавили ещё одни скобки. Группе можно дать имя — и результат начинает читаться сам.
Группы полезны не только при чтении, но и при замене: в строке-замене на них ссылаются как $1, $2 — по тем же номерам.
Простая валидация — это тот же test с якорями по краям. Только держите ожидания приземлёнными: полная проверка адреса почты по стандарту занимает сотни символов и всё равно не докажет, что ящик существует. Практичнее отсечь явный мусор, а настоящую проверку сделать письмом с кодом.
И главное. Регулярка — очень плотная запись: пять символов заменяют двадцать строк кода, но те же пять символов через месяц могут стать головоломкой для вас самих. Если шаблон разросся, разбейте задачу — сначала split, потом простая проверка каждого куска. А рядом с нетривиальным шаблоном оставьте комментарий с примером строки, которую он ловит.
Регулярка, которую не выходит объяснить вслух за минуту, — первый кандидат на замену обычным кодом.
- Регулярка — шаблон между косыми чертами; флаги меняют правила: i игнорирует регистр, g ищет все совпадения, m включает якоря на каждой строке.
- test отвечает true или false, match возвращает найденное — и null, если совпадений нет; результат match нужно подстраховывать.
- Классы \d, \w, \s и наборы в квадратных скобках описывают, что искать; квантификаторы +, *, ?, {n} — сколько раз подряд.
- Класс \w работает только с латиницей: для кириллицы пишут явный диапазон вроде [а-яё] с флагом i.
- Якоря ^ и $ привязывают шаблон к краям строки — на них держится любая проверка формата; круглые скобки группируют и запоминают совпавший кусок.
1/3Что напечатает console.log("год 2026".match(/\d+/g))?
2/3Какой шаблон проверяет, что строка состоит ровно из пяти цифр и больше в ней ничего нет?
3/3Что вернёт "чат".match(/\w/g)?
Сумма всех чисел в строке
Напишите функцию sumNumbers(str): она находит в строке все целые числа и возвращает их сумму. Если чисел нет — 0.
Все числа достаёт match с флагом g. Два момента: результат может быть null, и найденные куски — строки, их нужно превратить в числа.
Без ?? [] вызов на строке без чисел упал бы с ошибкой: у null нет метода reduce.
Проверка формата времени
Напишите isTime(str): ровно две цифры, двоеточие, ровно две цифры — и ничего лишнего вокруг.
Ключевое здесь — якоря: без них шаблон нашёл бы время внутри любой строки, и третья проверка вернула бы true.
Такой шаблон пропустит и «99:99». Если нужно осмысленное время, ограничьте диапазоны наборами: /^([01]\d|2[0-3]):[0-5]\d$/.