Шпаргалка по регулярным выражениям

Многие пользовались поиском файлов в своей операционной системе. Например, "*.txt", где * это любая последовательность символов, а ? - это один произвольный символ. Так вот. Это не регулярные выражения. Подобные выражения называются файловыми глобами или Групповыми символами (wildcards).

Дальше про регулярные выражения

По аналогии, специальные символы, которые не несут буквальный смысл, называются метасимволами. Все остальные символы, несущие буквальный смысл, называются литералами.

Начало и конец строки

Под строкой подразумевается не переменная с типом string, а любой текст в его начале и после символа переноса строки. Аналогично конец строки.

  • ^ - начало строки. ^Отчет - найдет все строки, начинающиеся со слова "Отчет"
  • $ - конец строки. txt$ - найдет все строки заканчивающиеся на "txt"

Специфика заключается в том, что они совпадают с определенной позицией в строке, а не с символами текста.

Выражение ^$ совпадет с пустой строкой.

Символьный класс [...]

Символьный класс [квадратные скобки] - это очень важное понятие. Потому что одни и те же символы могут обозначать совершенно разные вещи внутри него и снаружи. Например, точка "." за пределами символьного класса является метасимволом и обозначает любой литерал. А внутри скобок [.] воспринимается буквально и будет совпадать с точкой.

[...] - в квадратных скобках можно перечислить символы, которые могут находиться в данной позиции.

Выражение [e] - совпадает с буквой "е", а выражение [ea] - совпадет с любой из этих букв.

Дефис внутри символьного класса

Внутри символьного класса дефис - это интервал. Например, [0123456789] = [0-9]

Выбрать все html-теги заголовков можно конструкцией <H[1-6]>.

Если дефис стоит в символьном классе первым, то он не может обозначать интервал, поэтому он будет интерпретироваться как литерал, то есть буквально.

Инвертированный символьный класс

[^..] - класс совпадет с любыми символами, не входящими в него. Внутри символьного класса "^" имеет уже другой смысл.

[^1-6] - совпадет с любыми символами не принадлежащими интервалу 1-6.

Выбор нескольких альтернатив

| - означает "или". Например, Bob|Robert. Используется как метасимвол вне символьного класса. То есть внутри [|] он будет воспринят буквально, как поиск вертикальной черты.

Подвыражения, объединенные таким способом называются альтернативами.

Конструкцию выбора можно отделять от остального выражения круглыми скобками, то есть gray|grey = gr(a|e)y.

Экранирование

Если нужно, чтобы метасимвол воспринимался буквально, нужно поставить перед ним слеш \

Другими словами - экранированный метасимвол становится литералом. Например поиск скобок в тексте должен выглядеть так \( и \).

Аналогично слеш превращает некоторые литералы в метасимволы. Например, \t - знак табуляции.

Метасимволы и квантификаторы

Квантификаторы определяют количество экземпляров элемента после которого стоят.

МетасимволОбозначениеПример
. (точка)заменяет любой символ (кроме переноса строки)
? (знак вопроса)предшествующий ему символ является не обязательным(July|Jul) = (July?)
+ (плюс)предшествующий символ встречается один или несколько раз
* (звездочка)предш. символ встречается любое количество раз, в том числе 0 раз
{min, max}количество совпадений от min до max[a-zA-Zа-яА-Я]{3,12} - букв должно быть не менее 3, но и не более 12
{0,1}Эквивалентно метасимволу ?
{1,}Эквивалентно метасимволу +
{0,}Эквивалентно метасимволу *
( ) круглые скобкиПрименяются для группировки, сохранения совпавшего текста или ограничения конструкций выбора
\tТабуляция
\nПеренос строки
\rВозврат каретки
\sЛюбой пропуск.
Объединяет в себе пробелы, табуляции, перенос строки, возврат каретки
\SВсе, что не относится к \s
\bГраница слова.
После него должны следовать словесные символы и тогда это начало слова.
Либо перед ним должны стоять словесные символы и тогда это конец слова.
\wЛюбая цифра, буква или знак подчеркивания[a-zA-Zа-яА-Я0-9_]
\WВсе, что не относится к \w
\dЦифры[0-9]
\Dвсе, что не относится к \d[^0-9]

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

Позволяют искать текст, который совпал с предыдущей частью выражения.

Например, нам нужно найти повторяющееся слово в тектсе. \b([a-zA-Z]+) \1 - здесь метасимвол \1 будет ссылкой на подвыражение в скобках. Сначала мы ищем начало слова, за ним будут следовать одна или несколько букв, затем пробел и потом эта же последовательность букв.

Кажой паре скобок будет соответствовать номер \1 \2 \3 ....

Пары скобок нумеруются в соответствии с порядковым номером открывающейся скобки слева направо. Поэтому можно вкладывать скобки друг в друга.

Несохраняющие круглые скобки

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

Когда мы ссылаемся на скобки, удобно отделить остальные пары скобок не предназначенные для ссылок.

Для этого существует конструкция (?: ). Это обеспечивает группировку без сохранения. То есть этим скобкам не будет присвоен номер.

  • Не будут участвовать в нумеровании ссылок. При присвоении \1 \2 \3 эти скобки можно не учитывать
  • Увеличат производительность, особенно в больших циклах.
  • Используются для наглядности.
Перейти к верхней панели