Регулярные выражения
Обзор
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-zа-я]+$/iu; const re2 = new RegExp('^[a-zа-я]+$', '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