Skip to content

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

Регулярные выражения (RegExp) - язык, позволяющий выполнять оптимальный поиск в строке.

1. Основы регулярных выражений

  • Синтаксис создания:

    • Литерал: /pattern/flags лучше всего использовать по умолчанию, если не требуется динамическое создание.
    • Конструктор: new RegExp('pattern', 'flags') при создании в таком виде, необходимо экранировать знак \. Использовать лучше всего в тех случаях, когда необходимо создание динамических регулярных выражений.
  • Флаги:

    • g (global): Поиск всех совпадений.
    • i (ignoreCase): Игнорирование регистра.
    • m (multiline): Многострочный режим.
    • s (dotAll): Разрешает . совпадать с символами новой строки.
    • u (unicode): Обработка строк в формате Unicode.
    • y (sticky): Поиск с позиции в строке.

2. Символы и классы символов

  • Буквенные и цифровые символы:

    • \d: Любая цифра (0-9).
    • \D: Любой символ, кроме цифры.
    • \w: Любая буква, цифра или _.
    • \W: Любой символ, кроме \w.
    • \s: Пробельный символ.
    • \S: Непробельный символ.
    • .: Любой символ, кроме новой строки (зависит от флага s).
  • Классы символов:

    • [abc]: Любой из символов a, b, c.
    • [^abc]: Любой символ, кроме a, b, c.
    • [a-z]: Любая строчная буква.
    • [0-9]: Любая цифра.

3. Якоря и границы

  • ^: Начало строки.
  • $: Конец строки.
  • \b: Граница слова.
  • \B: Не граница слова.

4. Группы и альтернативы

  • Скобки для группировки:
    • (abc): Группа для захвата.
    • (?:abc): Негруппирующая группа.
    • (?<name>abc): Именованная группа захвата.
  • Альтернатива:
    • a|b: Либо a, либо b.

5. Повторители

  • {n}: Ровно n раз.
  • {n,}: n раз или больше.
  • {n,m}: От n до m раз.
  • *: 0 или больше раз (эквивалентно {0,}).
  • +: 1 или больше раз (эквивалентно {1,}).
  • ?: 0 или 1 раз (эквивалентно {0,1}).
  • Ленивая версия повторителя:
    • *?, +?, {n,m}?: Минимальное количество совпадений.

6. Жадность и лень

  • Жадные повторители (по умолчанию): Захватывают максимально возможное количество символов.
  • Ленивые повторители (с ?): Захватывают минимальное количество символов.

7. Обратные ссылки

  • \1, \2, …: Ссылаются на группы захвата.
  • \k<name>: Ссылка на именованную группу.

8. Утверждения

  • Положительные:
    • (?=abc): После позиции должен быть abc (позитивный просмотр вперед).
    • (?<=abc): Перед позицией должен быть abc (позитивный просмотр назад).
  • Отрицательные:
    • (?!abc): После позиции не должно быть abc.
    • (?<!abc): Перед позицией не должно быть abc.

9. Специальные символы

  • Экранирование: \ для специальных символов (., *, ?, [, ], (, ) и др.).
  • Символы Unicode:
    • \uXXXX: Символ в формате Unicode.
    • \xXX: Символ в формате ASCII.
    • \p{...}: Классы Unicode (например, \p{L} для букв).

10. Работа с регулярными выражениями

  • Методы строк:
    • str.match(regexp): Возвращает совпадения или null.
    • str.matchAll(regexp): Итератор всех совпадений (работает только с g).
    • str.search(regexp): Индекс первого совпадения или -1.
    • str.replace(regexp, replacement): Замена совпадений.
    • str.split(regexp): Разбиение строки.
  • Методы RegExp:
    • regexp.test(str): Проверяет наличие совпадения (true/false).
    • regexp.exec(str): Возвращает первое совпадение или null.

11. Современные возможности

  • Именованные группы:
    javascript
    const regex = /(?<day>\d{2})-(?<month>\d{2})-(?<year>\d{4})/
    const match = regex.exec('15-06-2023')
    console.log(match.groups.day) // "15"
  • Unicode-свойства:
    javascript
    const regex = /\p{Script=Greek}/u
    console.log(regex.test('α')) // true
  • Lookbehind (задний просмотр): (?<=...), (?<!...).

12. Практические примеры

  • Поиск подстроки
js
const str = "Ваша заявка #223311";
const yourOrder = /Ваша заявка/;
str.test(yourOrder);
  • Проверка номера телефона:
    javascript
    const phoneRegex =
      /^\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{1,4}[-.\s]?\d{1,9}$/
  • Валидация email:
    javascript
    const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/