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

Регулярные выражения представляют собой специальную текстовую строку, которая задает шаблон поиска (от английского pattern) с использованием тех символов, которые нужно найти, и специальных символов.
. – один любой символ
\. – экранирование символа
Символьный класс — это специальное обозначение, задающее поиск любого символа из определенного набора. Описываются в квадратных скобках.
[a-z] – строчные буквы английского алфавита
[0-9] – цифры
[^aj] — ^ — инвертирование
Дефис указывается в начале и в конце группы — / [aj-]
\d – цифры; \D – не цифры
\s – пробельные символы; \S – не пробельные символы
\w – буквы, цифры и нижнее подчеркивание; \W – остальное
^ — поиск в начале строки (/^java)
$ — поиск в конце строки (/script$)
Специальный символ \b позволяет найти символ относительно границ слова. (/a\b – найдет a в конце слова; /\ba– найдет a в начале слова)
\B — найти все символы, не находящиеся в конце слова (/a\B – найдет символы a вначале и внутри слова; /\Ba – найдет символы a на краях и внутри слова; /\Ba\B – только внутри слова)
| — означает ИЛИ (/gr(a|e)y – grey / gray)
Квантификация — это поиск последовательностей. Квантификатор — это специальный ограничитель, который указывает количество возможных повторений символа, группы символов или класса символов, находящихся в регулярном выражении перед ним.
? — обозначает поиск совпадений с повторением от нуля до одного раза (/colou? //
color, colour, colouur, colouuur)
+ — квантификатор означает, что предшествующий ему символ, группа или класс символов, должны повторяться как минимум один раз.
* отсутствие повторений или повторения несколько раз, что дает нам совпадение во всех подстроках
{} — указать в них необходимое число или диапазон повторений (в т.ч. допускается не указывать верхнюю / нижнюю границу)
- /colou{2,3}r
- /colou{2,}r
- /colou{2}r
Жадное сопоставление — квантификатор повторяется столько раз, сколько это возможно. По умолчанию в регулярных выражениях квантификация жадная
Чтобы избежать жадного поведения, вместо любого символа внутри тэга мы можем задать любой символ, за исключением закрывающего.
Когда ? идёт сразу после квантификатора, он рассматривается регулярным выражением как специальный символ, который из жадных квантификаторов делает ленивые.
По умолчанию все группы символов, которые мы создаем, записываются в специальную область памяти и маркируются символами от \1 до \9. Если бы мы использовали квантификацию, то это не повлияло бы на результат, потому что она не участвует в обратной связи и берётся только первое вхождение в область памяти
/(ta|tu)-\1 //ta-tu ta-ta tu-tu
Если вы используете несколько групп, то не очень удобно запоминать их по номерам. Гораздо проще пользоваться именами. Для этого нужно добавить ?<имя> после открытия скобки.
Отключить обратную связь можно поставив ?: внутри группы
Для атомарной группировки вместо : используется символ >
/a(?>bc|b|x)cc //abccaxcc
сначала находится символ a, затем — bc, после чего идет поиск cc. В обычном случае в примере выше поиск откатился бы до a и продолжил бы проверку с b, поскольку стоит символ альтернативы |. После этого мы бы дошли до cc и проверка бы сработала.
Атомарная группировка не поддерживается некоторыми популярными языками программирования, в том числе JavaScript и Python.
Но при атомарной группировке возврат по строке до символа a отключается, и происходит дальнейшее движение по альтернативам bc -> b -> x, а после x — сопоставление cc.
Модификаторы — это символы, которые указываются после знака ? в группе символов регулярного выражения и меняют их поведение.
Если после ? мы поставим i, то включим режим игнорирования регистра и получим сопоставление ещё одной подстроки
Модификатор s делает так, что точка начинает включать в себя перевод строки и возврат каретки.
Модификаторы могут быть отключены. Для этого достаточно указать перед ними –
i | Самый важный модификатор, указав который регистр (строчная или прописная буква) при поиске соответствий учитываться не будет. |
U | Если указать данный модификатор, то будет вестись поиск минимального по длине соответствия. По умолчанию же ищется максимальное по длине соответствие. |
m | Данный модификатор будет искать соответствие только в одной строке, а не по всему тексту. |
s | Противоположность модификатору m, то есть, указав данный модификатор, соответствие будет искаться по всему тексту. |
x | При использовании данного модификатора пробельные символы будут игнорироваться. То есть Вы можете написать хоть 100 пробелов, и они будут опущены. Если, конечно, Вы их не экранируете (с помощью «\«). |
Регулярное выражение a(?=b) находит совпадения таких a, за которыми следует b, не делая b частью сопоставления.
Просмотр вперёд также может быть негативным — тогда он будет искать совпадения в тех подстроках, где указанная в скобках часть подстроки отсутствует a(?!b)
Просмотр назад: (?<=b)a (?
Регулярные выражения поддерживают поиск по условию.
/(?(?<=condition)if_true|if_false)
/(?(?<=a)m|p) //mam,pap
Флаги
По умолчанию ищется первое соответствие, после чего поиск останавливается. Для изменения поведения используются флаги
/g, который называется «глобальный» или global, включает поиск всех сопоставлений в строке и не останавливает поиск после первого совпадения
флаг /i включает режим игнорирования регистра
флаг /s включает соответствие метасимвола . переводу строки, то есть делает так, что строка, в которой ищутся совпадения, может быть представлена как одна строчка