Приложение 4. Perl-совместимые регулярные выражения

Подробную информацию по Perl-совместимым регулярные выражениям (Perl Compatible Regular Expressions, PCRE) можно найти в документации к Perl (см. http://perldoc.perl.org/perlre.html), в документации к использованной в Parser библиотеке PCRE (см. http://www.pcre.org/man.txt), а также в большом количестве специальной литературы, содержащей помимо всего остального много практических примеров. Особенно детально использование регулярных выражений описано в книге Дж. Фридла «Регулярные выражения» издательства «O'Reilly» (ISBN 1-56592-257-3), перевод книги на русский язык: издательство «Питер» (ISBN: 5-272-00331-4, второе издание; ISBN: 5-318-00056-8 первое издание).

Краткое описание, которое приводится тут, имеет справочный характер.

Регулярное выражение - это шаблон для поиска подстроки, который должен совпасть с подстрокой слева направо в строке поиска. Большинство символов в этом шаблоне представлены сами собою, и при поиске просто проверяется наличие этих символов в строке поиска в заданной последовательности. В качестве простейшего примера можно привести шаблон для поиска «шустрая лиса», который должен совпасть с аналогичным набором символов в строке поиска. Мощь регулярных выражений состоит в том, что помимо обычных символов, они позволяют включать в шаблоны альтернативные варианты выбора и повторяющиеся фрагменты с помощью метасимволов. Эти метасимволы ничего не значат сами по себе, но при использовании их в регулярных выражениях, они обрабатываются особым образом.

Существует два различных набора метасимволов:

1.   Распознаваемые в любой части шаблона, не заключенной в квадратные скобки
2.   Распознаваемые в частях шаблона, заключенных в квадратные скобки

К метасимволам, распознаваемым вне квадратных скобок относятся следующие:

\

общее обозначение для 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    «истинный» конец строки


User comments:

G_Z 04.03.2015 19:53

. символьный класс, содержащий все символы. Этот метасимвол, совпадает с любым символом кроме символа новой строки по умолчанию.


Ошибка.
Точка по умолчанию совпадает и с символом новой строки.


coel 14.08.2011 11:21

RegexPal — яваскриптовый тестер регулярных выражений
http://regexpal.com/
в помощь разработчикам!


Sumo 28.03.2011 10:08

Unicode-properties для регулярных выражений - http://www.regular-expressions.info/unicode.html


pereskokov 09.05.2008 01:42

Может быть, новичкам (типа меня) будет полезна следующая информация:
— при использовании обратного слэша для экранирования парных квадратных скобок его нужно ставить только один раз, перед открывающей скобкой, то есть правильно:

^file:list[$path; obj\[$n1]photo\[$n2].jpg]
а не
^file:list[$path; obj\[$n1]photo\[$n2].jpg]
И еще, пара статей, очень и очень полезных при знакомстве с регулярными выражениями (упоминавшиеся на форуме):
http://phpclub.ru/detail/article/regexp_1
http://phpclub.ru/detail/article/regexp_2


In order to add comments you must register.
Copyright © 1997–2021 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 29.03.2011