Синтаксис регулярных выражений в стиле Perl

Регулярные выражения представляют собой образцы для поиска заданных комбинаций символов в текстовых строках и замены их на другие комбинации символов (эти операции называются соответственно сопоставление с образцом и подстановка). Регулярное выражение имеет вид:

/pattern/modifiers

Здесь pattern — это строка, задающая регулярное выражение, а modifiers — необязательные однобуквенные модификаторы, уточняющие правила использования этого регулярного выражения.

Регулярное выражение может состоять из обычных символов; в этом случае оно будет соответствовать заданной комбинации символов в строке. Например, выражение /кат/ соответствует выделенным подстрокам в следующих строках: "каток", "закат", "укатить". Однако, подлинную силу регулярным выражениям придает возможность использования в них специальных метасимволов.

Метасимволы в регулярных выражениях

Символ  Описание
\ Для символов, которые обычно трактуются буквально, означает, что следующий символ является метасимволом. Например, /n/ соответствует букве n, а /\n/ соответствует символу перевода строки.
Для метасимволов означает, что символ должен пониматься буквально. Например, /^/ означает начало строки, а /\^/ соответствует просто символу ^. /\\/ соответствует обратной косой черте \.
^ Соответствует началу строки (ср. модификатор m).
$ Соответствует концу строки (ср. модификатор m).
. Соответствует любому символу, кроме разрыва строки (ср. модификатор s).
* Соответствует повторению предыдущего символа нуль или более раз.
+ Соответствует повторению предыдущего символа один или более раз.
? Соответствует повторению предыдущего символа нуль или один раз.
(pattern) Соответствует строке pattern и запоминает найденное соответствие.
x|y Соответствует x или y.
{n} n — неотрицательное число. Соответствует ровно n вхождениям предыдущего символа.
{n,} n — неотрицательное число. Соответствует n или более вхождениям предыдущего символа. /x{1,}/ эквивалентно /x+/. /x{0,}/ эквивалентно /x*/.
{n,m} n и m — неотрицательные числа. Соответствует не менее чем n и не более чем m вхождениям предыдущего символа. /x{0,1}/ эквивалентно /x?/.
[xyz] Соответствует любому символу из заключенных в квадратные скобки.
[^xyz] Соответствует любому символу, кроме заключенных в квадратные скобки.
[a-z] Соответствует любому символу в указанном диапазоне.
[^a-z] Соответствует любому символу, кроме лежащих в указанном диапазоне.
\a Соответствует символу звонок (BEL).
\A Соответствует только началу строки, даже с модификатором m.
\b Соответствует границе слова, т. е. позиции между \w и \W в любом порядке.
\B Соответствует любой позиции, кроме границы слова.
X Соответствует символу Ctrl+X. Например, /\cI/ эквивалентно /\t/.
\C Соответствует одному байту, даже при директиве use utf8.
\d Соответствует цифре. Эквивалентно [0-9].
\D Соответствует нецифровому символу. Эквивалентно [^0-9].
\e Соответствует символу escape (ESC).
\E Конец преобразований \L, \Q, \U.
\f Соответствует символу перевода формата (FF).
\G Соответствует позиции в строке, равной pos().
\l Преобразует следующий символ в нижний регистр.
\L Преобразует символы в нижний регистр до \E.
\n Соответствует разрыву строк.
\pproperty Соответствует символам Unicode, обладающим свойством property. Если property задается несколькими символами, используйте синтаксис \p{property}.
\Pproperty Соответствует символам Unicode, не обладающим свойством property. Если property задается несколькими символами, используйте синтаксис \P{property}.
\Q Добавляет символ "\\" перед метасимволами до \E.
\r Соответствует символу возврата каретки (CR).
\s Соответствует символу пробела. Эквивалентно /[ \f\n\r\t]/.
\S Соответствует любому непробельному символу. Эквивалентно /[^ \f\n\r\t]/.
\t Соответствует символу табуляции (HT).
\u Преобразует следующий символ в верхний регистр.
\U Преобразует символы в верхний регистр до \E.
\w Соответствует латинской букве, цифре или подчеркиванию. Эквивалентно /[A-Za-z0-9_] /.
\W Соответствует любому символу, кроме латинской буквы, цифры или подчеркивания. Эквивалентно /[^A-Za-z0-9_] /.
\X Соответствует последовательности символов Unicode из основного символа и набора диакритических значков. Эквивалентно выражению /C<(?:\PM\pM*)>/.
\z Соответствует только концу строки, даже с модификатором m.
\Z Соответствует только концу строки или разрыву строк в конце строки, даже с модификатором m.
\n n — положительное число. Соответствует n-ной запомненной подстроке. Если левых скобок до этого символа меньше, чем n, и n > 9, то эквивалентно \0n.
\0n n — восьмеричное число, не большее 377. Соответствует символу с восьмеричным кодом n. Например, /\011/ эквивалентно /\t/.
\xn n — шестнадцатеричное число, состоящее из двух цифр. Соответствует символу с шестнадцатеричным кодом n. Например, /\x31/ эквивалентно /1/.
\x{n} n — шестнадцатеричное число, состоящее из четырех цифр. Соответствует символу Unicode с шестнадцатеричным кодом n. Например, /\x{2663}/ эквивалентно /♣/.

 

Модификаторы

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

Классы символов Unicode и POSIX

Мы можем использовать в регулярных выражениях синтаксис

[:class:]

где class задает название класса символов POSIX, т. е. мобильного стандарта на язык C. При использовании директивы use utf8 вместо классов POSIX можно использовать классы символов Unicode в конструкции

\p{class}

В следующей таблице сведены все классы символов POSIX, соответствующие классы символов Unicode и метасимволы, если они есть.

POSIX Unicode Метасимвол Описание
alpha IsAlpha   Буквы
alnum IsAlnum   Буквы и цифры
ascii IsAscii   Символы ASCII
cntrl IsCntrl   Управляющие символы
digit IsDigit \d Цифры
graph IsGraph   Буквы, цифры и знаки пунктуации
lower IsLower   Строчные буквы
print IsPrint   Буквы, цифры, знаки пунктуации и пробел
punct IsPunct   Знаки пунктуации
space IsSpace \s Символы пробела
upper IsUpper   Прописные буквы
word IsWord \w Буквы, цифры и подчеркивание
xdigit IsXDigit   Шестнадцатеричные цифры

Например, десятичное число можно задать любым из следующих трех способов:

/\d+/
/[:digit:]+/
/\p{IsDigit}+/ # use utf8

Для указания того, что символ не принадлежит к заданному классу, используются конструкции

[:^class:]
\P{class}

Например, следующие выражения имеют одинаковый смысл:

[:^digit:]  \D  \P{IsDigit}
[:^space:] \S \P{IsSpace}
[:^word:] \W \P{IsWord}

Запоминание подстрок

Использование круглых скобок в регулярном выражении приводит к тому, что подстрока, соответствующая образцу в скобках, запоминается в специальном буфере. Внутри функции, которая будет выполнять операцию со строкой при помощи вышеприведенного условия, совпадение будет запоминаться в специальных переменных, в PHP к ней можно обращаться через \1 в Perl - $1. В одном условии поиска может быть несколько инструкций запоминания: ([a-z]{5})([1-8]{4}) - проверит строку на совпадение с условием, в случае удачного совпадения, запомнит пять букв в \1 ($1), четыре цифры в \2 ($2). Если обратиться к переменной \0, то окажется, что в ней хранится вся совпавшая строка, которая была описана условием.

В РНР существует пять функций поиска по шаблону с использованием Perl-совместимых регулярных выражений: