Регулярные выражения в JavaScript с примерами: на практике

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Регулярные выражения в JavaScript с примерами: на практике

Регулярные выражения (RegExp) — это мощный инструмент для поиска, замены и валидации текста. В JavaScript, особенно в среде Node.js, они применяются повсеместно: от парсинга логов до проверки форм. В этой статье мы разберём синтаксис, методы и напишем практические примеры, которые вы сможете сразу использовать в своих проектах.

1. Основы синтаксиса и создание RegExp

В JavaScript регулярное выражение можно создать двумя способами: литералом и конструктором. Литерал удобен для статических паттернов, конструктор — для динамических.

// Литерал (рекомендуется)
const regexLiteral = /hello/gi;

// Конструктор (для динамических паттернов)
const pattern = "hello";
const flags = "gi";
const regexConstructor = new RegExp(pattern, flags);

Флаги (модификаторы):

  • g — глобальный поиск (находит все совпадения, а не первое)
  • i — регистронезависимый поиск
  • m — многострочный режим (якоря ^ и $ работают для каждой строки)
  • s — позволяет точке . совпадать с символом новой строки
  • u — включает полную поддержку Unicode

Базовые метасимволы:

  • . — любой символ, кроме новой строки
  • \d — цифра (0-9)
  • \w — буква, цифра или подчёркивание
  • \s — пробельный символ (пробел, табуляция, перевод строки)
  • ^ — начало строки
  • $ — конец строки
  • [] — класс символов (например [a-z] — все строчные буквы)
  • () — группа захвата
  • | — логическое ИЛИ

2. Основные методы для работы с регулярными выражениями

В JavaScript есть несколько методов, которые работают с RegExp. Рассмотрим их на практических примерах.

2.1. test() — проверка на совпадение

Метод возвращает true или false. Идеален для валидации.

const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
const emails = ["user@example.com", "invalid-email", "test@domain.co.uk"];

emails.forEach(email => {
  console.log(`${email}: ${emailPattern.test(email)}`);
});
// user@example.com: true
// invalid-email: false
// test@domain.co.uk: true

2.2. exec() — поиск с деталями

Возвращает массив с совпадением и группами захвата. Удобен для извлечения данных.

const logLine = "ERROR: 2023-10-15 14:30:00 - Server crash";
const logPattern = /^(ERROR|WARN|INFO): (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (.+)$/;
const result = logPattern.exec(logLine);

if (result) {
  console.log(`Уровень: ${result[1]}`);
  console.log(`Дата: ${result[2]}`);
  console.log(`Сообщение: ${result[3]}`);
}
// Уровень: ERROR
// Дата: 2023-10-15 14:30:00
// Сообщение: Server crash

2.3. match() — поиск в строке

Метод строки, который возвращает массив совпадений. С флагом g — все совпадения, без — первое с группами.

const text = "Тел: +7(999)123-45-67, +7(495)765-43-21";
const phonePattern = /\+7\(\d{3}\)\d{3}-\d{2}-\d{2}/g;
const phones = text.match(phonePattern);

console.log(phones);
// ['+7(999)123-45-67', '+7(495)765-43-21']

2.4. replace() — замена текста

Позволяет заменить совпадения на новую строку. Поддерживает специальные символы, такие как $1 для групп захвата.

const messyDate = "2023/10/15";
const cleanDate = messyDate.replace(/(\d{4})\/(\d{2})\/(\d{2})/, "$3.$2.$1");
console.log(cleanDate); // 15.10.2023

// Маскировка email
const email = "john.doe@example.com";
const masked = email.replace(/(.{2})(.*)(@.*)/, "$1***$3");
console.log(masked); // jo***@example.com

2.5. split() — разделение строки

Метод строки, который может использовать RegExp для разделения.

const csvLine = "apple, banana; cherry| date";
const items = csvLine.split(/[,;|]\s*/);
console.log(items); // ['apple', 'banana', 'cherry', 'date']

3. Практические примеры для Node.js

Рассмотрим задачи, которые часто встречаются в реальной разработке на Node.js.

3.1. Валидация пароля

Пароль должен содержать минимум 8 символов, хотя бы одну заглавную букву, одну строчную, одну цифру и один спецсимвол.

const passwordPattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+])[A-Za-z\d!@#$%^&*()_+]{8,}$/;

const passwords = ["Weak1!", "StrongPass1!", "short1A!"];
passwords.forEach(pwd => {
  console.log(`${pwd}: ${passwordPattern.test(pwd)}`);
});
// Weak1!: false (нет заглавной)
// StrongPass1!: true
// short1A!: false (менее 8 символов)

3.2. Парсинг URL из текста

Извлечение всех HTTP/HTTPS ссылок из произвольного текста.

function extractURLs(text) {
  const urlPattern = /https?:\/\/[^\s"'<>()]+                

Блоги

Рекомендаций по книгам