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

Регулярные выражения (англ. «regular expressions», жарг. «регэкспы» или «регексы») —- современная система поиска текстовых фрагментов в электронных документах, основанная на специальной системе записи образцов для поиска. Образец (англ. «pattern»), задающий правило поиска, по-русски также иногда называют «шаблоном», «маской», или на английский манер «паттерном». Регулярные выражения произвели прорыв в электронной обработке текста в конце XX века. (с) pcre.ru

Я достаточно часто пользуюсь регулярными выражениями, вот тут и тут я уже приводил примеры использования, так же и сам активно ими пользуюсь в моей небольшой поделке TorrentMonitor. Регулярные выражения это мощный инструмент для работы с данными. О синтаксисе я сегодня и попробую рассказать.

Регулярные выражения (англ. «regular expressions», жарг. «регэкспы» или «регексы») —- современная система поиска текстовых фрагментов в электронных документах, основанная на специальной системе записи образцов для поиска. Образец (англ. «pattern»), задающий правило поиска, по-русски также иногда называют «шаблоном», «маской», или на английский манер «паттерном». Регулярные выражения произвели прорыв в электронной обработке текста в конце XX века. (с) pcre.ru

Синтаксис шаблонов
| Логическое «или», ищет один из заданных шаблонов:
/п|р/
данное выражение будет искать один из указанных символов, сначала «и», и если не найдёт, то «к»

. Точка в шаблоне может заменять любой символ, т.к. совпадает с любым символом строки, кроме перевода каретки \n:
/./
«привет» — совпадёт с «п», «р», «и», «в», «е», «т»
«пр\nив\nет» — совпадёт с «п», «р», «и», «в», «е», «т», \n — не совпадёт

Позиция внутри строки
Символы (представления), позиционирующие регулярное выражение относительно элемента строки:
ˆ Говорит о том, что бы в начале обязательно стояли следующие за ним символы:
/ˆп/
«привет» — совпадёт
«здравствуйте» — нет

$ Означает что в конце фразы должны стоять следующие символы:
/т$/
«привет» — совпадёт
«здравствуйте» — нет

\b Символ на границе слова
/\bп/
«привет путешественник» — вернёт оба слова
/п\b/
«привет халоп» — вернёт «халоп»

\B Противоположный предыдущему, означающий _не_ на границе слова
/\Bи\B/
«привет» — совпадёт

\G Возвращает предыдущий успешный поиск
/\Gт/
«привет халоп» — совпадёт (поиск остановился после успешно найтенной «т»)

Так же существуют уже подготовленные классы символов (символические классы):
\d — любой цифровой символ
\D — любой не цифровой символ
\s — любой пробельный символ (\t\ \r\f\n\t\ \r\f\n)
\S — любой не пробельный символ
\w — любой алфавитно-цифровой символ (a-zA-Z0-9_)
\W — любой не алфавитно-цифровой символ

/\d{6,8}/
«привет» — совпадёт
«здравствуйте» — не совпадёт

Последовательности
* Звёздочка в шаблоне означает кол-во совпадений — ноль или более раз, так же есть аналогичный символ +, который так же означает кол-во совпадений, только один и более раз:
/п*/
«привет» — совпадёт
«здравствуйте» — так же совпадёт, т.к. числитель может быть 0

/п+/
«привет» — совпадёт
«здравствуйте» — не совпадёт

? Так же аналогичный символ, т.к. тоже означает кол-во совпадений, только на этот раз ноль или один:
/п?/
«привет паша» — не совпадёт, т.к. более одного раза
«привет» — совпадёт
«здравствуйте» — так же совпадёт, т.к. числитель может быть 0

При помощи фигурных скобок {} можно указать кол-во совпадений самостоятельно:
* аналогично {0, } — ноль или более раз
+ аналогично {1, } — один или более раз
? аналогично {0,1} — ноль или один раз
т.е. первое значение — минимальное кол-во совпадений, второе — макимальное

«привет{1,2}» — «привет» должно повторяться один или два раза
«здравствуйте{7,20}» — «здравствуйте» должно повторяться семь или двадцать раз

Экранизация
\ Обратный слеш в шаблоне экранирует идущий за ним символ и делает его обычным:
/\?/ — будет означать просто знак вопроса
/\./ — будет означать просто точку

«a\.?» будет соответствовать «a.» или «a»
«a\\\\b» будет соответствовать «a\\b»
«a\[F\]» будет соответствовать «a[F]»
«\Q+-*/\E» будет соответствовать «+-*/»

Спецсимволы, требующие экранизации
\\ \. \| \( \) \[ \ \] \{ \} \? \* \+ \ˆ \/ \# \!

Подшаблоны
Сам шаблон, может содержать в себе подшаблоны
() Скобки являются ограничителями подшаблонов:
/<(p|div)>(.+?.)<\/(p|div)>/

привет

— совпадёт

здравствуйте

— совпадёт
Здесь у нас 3 подшаблона. Здесь стоит оговорится что там же существуют «ссылки» на подшаблоны, т.е. в самом шаблоне мы может обратиться к любому из подшаблонов, соответственно наш предыдущий пример правильнее записать:
/<(p|div)>(.+?.)<\///1>/
//1 Это сылка на (в данном случае первый) подшаблон.

Модификаторы
i — игнорировать регистр
/привет/i
«привет» — совпадёт
«пРиВеТ» — совпадёт
«ПРИВЕТ» — совпадёт

s — символ ‘.’ соответствует и символу \n
/./s
«привет» — совпадёт с «п», «р», «и», «в», «е», «т»
«пр\nив\nет» — совпадёт с «п», «р», «\n», «и», «в», «\n», «е», «т»

m — символы ‘ˆ’ и ‘$’ так же начинают учитывать \n

D — символ ‘$’ не учитывает \n

A — сообщает что шаблон нужно искать в фактическом начале строки, в которой ищем

Есть ещё несколько модификаторов, но они используются реже:
U, x, X, S

Что бы понять всё это лучше, советую посмотреть различные примеры использования (например на pcre.ru, и хотя всё написано достаточно давно, всё это продолжает так же успешно работать и применяться).

Добавить комментарий