Perl-совместимые регулярные выражения
Приложение 4.
Подробная информация о Perl-совместимых регулярных выражениях PCRE доступна в документации к Perl (см. perldoc.perl.org/perlre) в документации к использованной в Parser 3 библиотеке PCRE (см. pcre.org/current/doc/html/), а также большом количестве специальной литературы, содержащей, помимо всего остального, множество практических примеров.
Особенно детально использование регулярных выражений описано в книге Дж. Фридла «Регулярные выражения» издательства O'Reilly (ISBN 1-56592-257-3), перевод книги на русский язык: издательство «Питер» (ISBN 978-5-93286-121-9 третье издание).
Краткое описание, которое приводится тут, имеет справочный характер.
Регулярное выражение — это шаблон для поиска подстроки, который должен совпасть с подстрокой слева направо в строке поиска. Большинство символов в этом шаблоне представлены сами собой, и при поиске просто проверяется наличие этих символов в строке поиска в заданной последовательности. В качестве простейшего примера можно привести шаблон для поиска «шустрая лиса», который должен совпасть с аналогичным набором символов в строке поиска. Мощь регулярных выражений состоит в том, что, помимо обычных символов, они позволяют включать в шаблоны альтернативные варианты выбора и повторяющиеся фрагменты с помощью метасимволов. Эти метасимволы ничего не значат сами по себе, но при использовании их в регулярных выражениях они обрабатываются особым образом.
Существует два различных набора метасимволов:
- распознаваемые в любой части шаблона, не заключенной в квадратные скобки;
- распознаваемые в частях шаблона, заключенных в квадратные скобки.
К метасимволам, распознаваемым вне квадратных скобок, относятся следующие:
\ — общее обозначение для escape-последовательностей; предусматривают различное использование, рассмотрены ниже^ — совпадает с началом фрагмента для поиска или перед началом строки в многострочном режиме$ — совпадает с концом фрагмента для поиска или перед концом строки в многострочном режиме. — символьный класс, содержащий все символы; этот метасимвол совпадает с любым символом, кроме символа новой строки по умолчанию.[…] — символьный класс; совпадает с любым элементом из списка, заданного в квадратных скобках| — метасимвол, означающий «или»; позволяет объединить несколько регулярных выражений в одно, совпадающее с любым из выражений-компонентов(…) — ограничение подстроки поиска в общем шаблоне поиска? — совпадает с одним необязательным символом* — совпадает с неограниченным количеством любых необязательных символов, указанных слева+ — совпадает с неограниченным количеством символов, указанных слева; для совпадения требуется хотя бы один произвольный символ{мин, макс} — интервальный квантификатор — требуется минимум экземпляров, допускается максимум экземпляров
Часть шаблона, заключенная в квадратные скобки, называется символьным классом. В описании символьного класса допустимо использовать только следующие метасимволы:
\ — escape-символ^ — инвертированный символьный класс, метасимвол обязательно должен быть первым символом в описании класса; совпадение будет происходить с любыми символами, не входящими в символьный класс- — обозначение интервала символов[…] - ограничитель символьного класса
Использование метасимвола \
Обратная косая черта предусматривает несколько вариантов использования. В случае если вслед за ним следует символ, не обозначающий букву алфавита, она выполняет функцию экранирования и отменяет специальное значение, которое может иметь этот символ. Такое использование этого метасимвола возможно как внутри символьного класса, так и вне его. Если, например, необходимо найти символ *, то используется следующая запись в шаблоне \*. В случае необходимости экранировать сам символ \ используется запись \\.
Второй вариант использования этого метасимвола — описание управляющих символов в шаблоне. Можно использовать следующие escape-последовательности:
\а — сигнал;\cx — control-x, где х — любой символ;\е — ASCII-символ escape;\f — подача бумаги;\n — новая строка;\r — возврат курсора;\t — табуляция;\xhh — шестнадцатеричный код символа hh;\ddd — восьмеричный код символа ddd.
Третий вариант — определение специфических символьных классов:
\d — любая десятичная цифра [0-9];\s — пропуск, пробел, обычно [ \f\n\r\t] (первый символ в квадратных скобках — пробел);\w — символ слова, обычно [a-zA-Z0-9_];\D \S \W отрицание \d \s \w.
Четвертый вариант — обозначение мнимых символов. В PCRE существуют символы, которые соответствуют не какой-либо литере или литерам, а означают выполнение определенного условия, поэтому в английском языке они называются утверждениями (assertion). Их целесообразно рассматривать как мнимые символы нулевого размера, расположенные на границе между реальными символами в точке, которая соответствует определенному условию. Эти утверждения не могут использоваться в символьных классах (\b имеет дополнительное значение и обозначает возврат каретки внутри символьного класса).
\b — граница слова\B — отсутствие границы слова \A — «истинное» начало строки \Z — «истинный» конец строки или позиция перед символом начала новой строки, расположенного в «истинном» конце строки \z — «истинный» конец строки