- Читать и писать шаблоны с классами символов, квантификаторами и якорями
- Использовать флаги
g,i,m,uи методыtest,match,matchAll,replace,split - Извлекать данные с помощью обычных и именованных групп и обходить типичные ловушки
Проверить, что номер телефона имеет вид +994 50 123 45 67, найти все хештеги в посте, превратить 2026-09-27 в 27.09.2026 — обычными строковыми методами каждая задача занимает десяток строк. Регулярное выражение (regular expression, regex) описывает шаблон текста в одной строке. Сначала оно выглядит загадочно, но собрано из небольшого набора «кирпичиков» — узнав их, ты легко его прочитаешь.
Создание regex и первые методы
Регулярное выражение создают двумя способами: литералом /шаблон/флаги или через new RegExp('шаблон', 'флаги'), когда шаблон собирается во время работы программы. Основные методы: regex.test(str) возвращает true/false; str.match(regex) даёт первое совпадение (с флагом g — все); str.replace(regex, замена) заменяет; str.split(regex) делит строку по шаблону.
const text = 'Order 15 arrived. Order 27 is late. Call 555.';
console.log(/late/.test(text));
console.log(/LATE/i.test(text));
console.log(text.match(/\d+/)[0]);
console.log(text.match(/\d+/g));
console.log(text.replace(/Order/g, 'Parcel'));
console.log('a1b22c333'.split(/\d+/));▸ Ожидаемый результат
true true 15 [ '15', '27', '555' ] Parcel 15 arrived. Parcel 27 is late. Call 555. [ 'a', 'b', 'c', '' ]
Строительные блоки
| Шаблон | Значение |
|---|---|
. | любой символ, кроме перевода строки |
\d \w \s | цифра; символ слова (латинская буква, цифра, _); пробельный символ. Заглавная буква — противоположность: \D, \W, \S |
[abc] [a-z] [^0-9] | один символ из набора; диапазон; символ не из набора |
* + ? | 0 или больше; 1 или больше; 0 или 1 |
{3} {2,5} | ровно 3 раза; от 2 до 5 раз |
^ $ \b | начало строки; конец; граница слова |
a|b ( ) (?<name> ) | или; группа; именованная группа |
const patterns = {
postcode: /^AZ\d{4}$/,
phone: /^\+994 \d{2} \d{3} \d{2} \d{2}$/,
username: /^[a-z][a-z0-9_]{2,15}$/,
};
const samples = {
postcode: ['AZ1000', 'AZ100', 'az1000'],
phone: ['+994 50 123 45 67', '+994501234567'],
username: ['leyla_07', '7leyla', 'ab'],
};
for (const [name, regex] of Object.entries(patterns)) {
const results = samples[name].map((value) => `${value}: ${regex.test(value)}`);
console.log(`${name} -> ${results.join(', ')}`);
}▸ Ожидаемый результат
postcode -> AZ1000: true, AZ100: false, az1000: false phone -> +994 50 123 45 67: true, +994501234567: false username -> leyla_07: true, 7leyla: false, ab: false
+ — специальный символ, поэтому, чтобы найти его буквально, пишут \+. Имя пользователя должно начинаться с буквы и иметь длину 3–16 символов.Флаги
g— глобальный поиск: все совпадения (нужен дляmatchAllи дляreplaceAllс regex);i— без учёта регистра;m— многострочный режим:^и$означают начало и конец каждой строки;s—.совпадает и с переводом строки;u— Unicode: корректно работают эмодзи и\p{L}(буква любого алфавита).
const words = 'Gəncə şəhəri';
console.log(words.match(/\w+/g));
console.log(words.match(/\p{L}+/gu));
const poem = 'first line\nsecond line\nthird line';
console.log(poem.match(/^\w+/gm));▸ Ожидаемый результат
[ 'G', 'nc', 'h', 'ri' ] [ 'Gəncə', 'şəhəri' ] [ 'first', 'second', 'third' ]
\w знает только буквы английского алфавита, поэтому «ə» и «ş» разрывают слова. Для азербайджанского, русского и турецкого текста используй \p{L} с флагом u.Группы и замена
Скобки захватывают части совпадения. match без g возвращает массив [полное совпадение, группа1, группа2, ...], а именованные группы лежат в .groups. matchAll (требует g) выдаёт все совпадения вместе с их группами. В replace $1 и $<имя> ссылаются на группы, а функция-замена получает совпадение и группы как аргументы.
const date = '2026-09-27';
const match = date.match(/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/);
console.log(match[1], match.groups.month, match.groups.day);
console.log(date.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3.$2.$1'));
const post = 'Learning #javascript and #regex at #Educora';
const tags = [...post.matchAll(/#(\w+)/g)].map((m) => m[1].toLowerCase());
console.log(tags);
const prices = 'tea 2 AZN, bread 1 AZN';
console.log(prices.replace(/(\d+) AZN/g, (whole, amount) => `${amount * 2} AZN`));▸ Ожидаемый результат
2026 09 27 27.09.2026 [ 'javascript', 'regex', 'educora' ] tea 4 AZN, bread 2 AZN
const html = '<b>bold</b> and <i>italic</i>';
console.log(html.match(/<.*>/)[0]);
console.log(html.match(/<.*?>/g));
const hasDigit = /\d/g;
console.log(hasDigit.test('a1'), hasDigit.test('a1'), hasDigit.test('a1'));
console.log('1.5'.match(/\d.\d/)[0], '1x5'.match(/\d.\d/)[0], /\d\.\d/.test('1x5'));▸ Ожидаемый результат
<b>bold</b> and <i>italic</i> [ '<b>', '</b>', '<i>', '</i>' ] true false true 1.5 1x5 false
Напиши isStrongPassword(password): пароль должен быть не короче 8 символов и содержать хотя бы одну цифру и одну заглавную латинскую букву. Для каждого правила используй отдельный regex и test.
function isStrongPassword(password) {
// 8+ characters, a digit, an uppercase letter
}
for (const password of ['secret', 'Secret123', 'secretpass1', 'SECRETPASS']) {
console.log(`${password}: ${isStrongPassword(password)}`);
}▸ Ожидаемый результат
secret: false Secret123: true secretpass1: false SECRETPASS: false
Преобразуй все даты вида ДД.ММ.ГГГГ в тексте в формат ISO ГГГГ-ММ-ДД и выведи результат. Затем выведи, сколько дат в тексте, в виде Dates: N.
const text = 'Exams: 05.06.2026 and 12.06.2026. Holidays from 20.06.2026.';
// 1) replace every DD.MM.YYYY with YYYY-MM-DD and print the text
// 2) print Dates: N▸ Ожидаемый результат
Exams: 2026-06-05 and 2026-06-12. Holidays from 2026-06-20. Dates: 3
Главное
- Регулярное выражение — шаблон текста:
/шаблон/флагиилиnew RegExp(...). - Строительные блоки: классы (
\d,\w,[a-z]), квантификаторы (+,*,?,{n,m}), якоря (^,$,\b), группы и|. - Флаги:
g— все совпадения,i— без учёта регистра,m— многострочный режим,u— Unicode (\p{L}). testпроверяет,match/matchAllизвлекают, аreplaceпреобразует с помощью$1,$<имя>или функции.- Привязывай проверочные шаблоны якорями; остерегайся жадного
.*,lastIndexприgиtestи неэкранированных спецсимволов.
Проверь себя
Вопросов: 10. Каждый правильный ответ приносит XP.
/^\d{3}$/?