Перейти к основному содержимому

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

Обзор

Regular Expression (regex) — шаблоны, используемые для сопоставления последовательностей символов в строках.

Регулярные выражения повсеместно используются при работе со строками и реализованы (нативно или через библиотеки) во всех развитых языках.

Возможности

  • поиск совпадений в строке
  • поиск совпадений с заменой
  • разбиение строки на части
  • тест строки на совпадение шаблону

Пример поиска совпадений в тексте:

/(the|an?)\s(\w+)/gi
Even after you did the initial work and had a specific architecture
in mind, you need to continuously monitor how the system evolves
and whether it still aligns with its users' needs, as those may also
change during the development and lifetime of your software. Software
decay, sometimes also called erosion, occurs when the implementation
decisions don't correspond to the planned architecture.

Синтаксис

Шаблон строится из элементов, которые предствляют из себя определённое подмножество символов с заданным числом повторений и/или дополнительных ограничений. Элементы могут быть объединены в группы с целью получения более сложной структуры или захвата отдельных частей совпадения.

ВыражениеЗначениеПример
\экранирование\[0\]
|логическое "или"yes|no
[]перечисление вариантов[Rr]eg[Ee]xp?
-внутри [] означает диапазон[a-f]
^внутри [] означает отрицание[^a-f]
()конструктор группы([a-z])\.com

Квантификаторы

Квантификатор повторяет элемент определенное количество раз; ставится после элемента, к которому он относится.

КвантификаторЧисло повторений
?0 или 1
*0 или более
+1 или более
{n}ровно n раз
{m,n}от m до n включительно
{m,}не менее m
{,n}не более n

Примеры:

  • an? — буква a, за которой может следовать n
  • [01]* — любое количество нулей и/или единиц
  • #[0-9a-f]{6} — решётка, за которой следует 6 цифр и/или букв от a до f

Метасимволы

Метасимвол (символьный класс) — специальное обозначение, которое соответствует любому символу из определённого набора.

МетасимволЗначениеОтрицание
.Любой символ
\dЦифровой символ: [0-9]\D
\sПробельный символ: [\f\n\r\t\v]\S
\wБуквы или цифры или нижнее подчёркивание\W
\bГраница слова\B
^Начало строки
$Конец строки

Lookarounds

Накладывают дополнительное ограничение на элемент: если совпадение найдено, проверяется, что находится до или после него.

ВыражениеНазвание
(?= )lookahead
(?! )negative lookahead
(?<= )lookbehind
(?<! )negative lookbehind

Примеры:

  • look(?= for) — находит look, только если после следует for
  • Java(?!Script) — находит Java, только если после НЕ следует Script
  • (?<= ")[\w ]+(?=" ) — находит слова, перед которыми стоит " и после которых стоит "

Группы

Группа обозначается с помощью скобок. По умолчанию каждая группа "захватывается" (т.е. попадает в результат), а её идентификатором служит порядковый номер. Изменить стандартное поведение можно с помощью следующего синтаксиса:

  • (?<name> ) — именованная группа (named group)
  • (?: ) — группа без захвата (non-capturing group)

Примеры:

  • (?:an? )(?<word>\w+) — находит слова, перед которыми стоит неопределённый артикль и заносит их в именную группу word
  • (\w+)(?: +\n)(\w+) — находит 2 слова на разных строках, между которыми перед переносом стоят пробелы; в массив групп попадают только слова

Флаги

Позволяют модифицировать шаблон целиком и задавать ему какое-либо поведение.

  • g (global) — поиск не останавливается после первого найденного совпадения
  • i (insensitive) — делает шаблон нечувствительным к регистру
  • u (unicode) — включает полную поддержку Юникода
  • y (sticky) — привязка к началу шаблона или к концу последнего совпадения

JavaScript RegExp

Синтаксис регулярных выражений в JavaScript вдохновлен Perl.
Есть два способа создания регулярного выражения: литерал и конструктор класса.

const re1 = /^[a--я]+$/iu;
const re2 = new RegExp('^[a--я]+$', 'iu');

Методы строк

  • .match — поиск совпадения в строке (вернёт массив)
  • .search — поиск совпадения в строке (вернёт индекс)
  • .replace — поиск совпадения и замена
  • .split — разбиение строки на массив подстрок

Примеры:

'a b_c'.match(/[ _]/g);  // [' ', '_']
'a b_c'.search(/[ _]/);  // 1
'a b_c'.split(/[ _]/);   // ['a', 'b', 'c']

Методы RegExp

  • .test — тест строки на совпадение шаблону

Примеры:

/^0b[01]+$/.test('0b10011010');  // true
/^0b[01]+$/.test('0x20A1D014');  // false

Ссылки: