Перейти к содержанию
Educora
Продвинутый22 мин21 / 27

Регулярные выражения

Ищи, проверяй и преобразуй текст регулярными выражениями: классы символов, квантификаторы, якоря, группы, флаги и методы `test`, `match`, `matchAll`, `replace`.

Проверь себя
В этом уроке ты узнаешь
  • Читать и писать шаблоны с классами символов, квантификаторами и якорями
  • Использовать флаги 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) делит строку по шаблону.

JavaScript
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> )или; группа; именованная группа
JavaScript
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} (буква любого алфавита).
JavaScript
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 и $<имя> ссылаются на группы, а функция-замена получает совпадение и группы как аргументы.

JavaScript
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
JavaScript
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.

Задание · JavaScript
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.

Задание · JavaScript
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.

1 / 10
Какой строке соответствует /^\d{3}$/?