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

Регулярные выражения (англ. «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, и хотя всё написано достаточно давно, всё это продолжает так же успешно работать и применяться).

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