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

Вступление

Регулярное выражение - это шаблон, с которым сравнивается указанная строка слева направо. Большинство символов в шаблоне являются самими собой, и совпадают с соответствующими символами в искомой строке. PCRE- регулярные выражения совместимых с Perl (Perl compatible regular expressions — PCRE).

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

Метасимволы

\общий экранирующий символ, допускающий несколько вариантов применения
^декларирует начало данных (или строки в многострочном режиме)
$декларирует конец данных или до завершения строки (или окончание строки в многострочном режиме)
.соответствует любому символу, кроме перевода строки (по умолчанию)
[начало описания символьного класса
]конец описания символьного класса
|начало ветки альтерннативного выбора
(начало подмаски
)конец подмаски
?расширяет смысл метасимвола (, является также квантификатором, означающим 0 или 1 вхождение, также преобразует жадные квантификаторы в ленивые)
*квантификатор, означающий 0 или более вхождений
+квантификатор, означающий 1 или более вхождений
{начало количественного квантификатора
} конец количественного квантификатора

Символьные классы

Открывающая квадратная скобка объявляет начало символьного класса, завершаемого закрывающей квадратной скобкой. Символ ] не имеет специального значения, и в случае, если закрывающая квадратная скобка необходима как член символьного класса, она должна быть первым символом непосредственно после открывающей квадратной скобки (если используется метасимвол ^, то непосредственно после него), либо экранироваться при помощи обратного слеша.

Символьный класс соответствует одиночному символу обрабатываемой строки, причем сам символ должен содержаться в наборе, определяемым классом. В случае, если первым символом описания класса является ^логика работы инвертируется: класс соответствует одиночному символу, который не содержится в наборе, определяемым классом. Если символ ^необходим как член класса, его не следует помещать первым символом в описании класса либо необходимо экранировать при помощи обратного слеша.

.Точка - любой символ
[ <символы>] квадратные скобки - класс символов ("любое из")
[^ <символы>] негативный класс символов ("любое кроме")
-тире - обозначение последовательности в классе символов ("[0-9]" — цифры)
alnumбуквы и цифры
alphaбуквы
asciiсимволы с кодами 0 - 127
blankтолько пробел или символ табуляции
cntrlуправляющие символы
digitдесятичные цифры (то же самое, что и \d)
graphпечатные символы, исключая пробел
lowerстрочные буквы
printпечатные символы, включая пробел
punctпечатные символы, исключая буквы и цифры
spaceпробельные символы(почти то же самое, что и \s)
upperпрописные буквы
wordсимволы "слова" (то же самое, что и \w)
xdigitшестнадцатеричные цифры

Класс пробельных символов space- это горизонтальная табуляция, перевод строки, вертикальная табуляция, разрыв страницы, возврат каретки и пробел. Учтите, что этот список включает вертикальную табуляцию. Это отличает spaceот \s, который не включает этот символ, для совместимости с Perl.

Название word- это расширение Perl, а blank- расширение GNU, начиная с версии Perl 5.8. Другое расширение Perl - это отрицание, которое указывается символом ^после двоеточия. Например, [12[:^digit:]]совпадет с "1", "2", или с любой не-цифрой.

Квантификатор

*Соответствие возникнет, если предыдущий символ будет повторяться любое число раз (в том числе и 0раз).
+Соответствие возникнет, если предыдущий символ будет повторяться хотя бы один раз. То есть отличие от квантификатора *, здесь требуется, чтобы предшествующий символ был бы хотя бы один раз.
?Соответствие возникнет, если предыдущего символа вообще не было, либо он был только один раз.
{n}Соответствие возникнет, если предыдущий символ будет повторяться ровно nраз.
{n,}Соответствие возникнет, если предыдущий символ будет повторяться nили более раз.
{n,m}Соответствие возникнет, если предыдущий символ будет повторяться от nдо mраз.

Якоря

^привязка к началу строки
$привязка к концу строки

По умолчанию, вне символьного класса метасимвол начала строки ^соответствует началу обрабатываемых данных (если не используются модификаторы). Внутри символьного класса он ^имеет совершенно другое значение.

Метасимвол начала строки ^не обязан быть первым символом шаблона в случае, если в шаблоне используются несколько альтернатив, но должен быть первым символом в каждой из альтернатив, в которой он встречается, если шаблон когда-либо сопоставим с соответствующей веткой. Если все альтернативы начинаются с метасимвола начала строки ^, то шаблон ограничен для совпадения исключительно в начале строки, говорят что шаблон "заякорен". (Существуют и другие способы "заякорить" шаблон).

Соответствие метасимволу конца строки $достигается только в конце строки или непосредственно перед последним символом в случае, если им является перевод строки (если модификаторы не указаны). Метасимвол конца строки $не обязан быть последним символом шаблона в случае, если используется несколько альтернатив, но должен быть последним символом в каждой альтернативе, в которой он фигурирует. Внутри символьного класса символ $не имеет специального значения.

Альтернативный выбор

Символ вертикальной черты |используется для разделения альтернативных масок. Например, шаблон яблоко|грушасоответствует как "яблоко", так и "груша". Допустимо указывать любое количество альтернатив, также допустимо указывать пустые альтернативы (соответствуют пустой строке). В процессе поиска соответствия просматриваются все перечисленные альтернативы слева направо, останавливаясь после первого найденного соответствия. В случае, если альтернативные варианты перечислены в подмаске, то весь шаблон совпадет только в случае соответствия одного из альтернативных вариантов подмаски и остатка основного шаблона.

Условные подмаски

В PCRE реализована возможность подчинять шаблон условию либо выбирать из двух условных подмасок в зависимости от успеха сопоставления предыдущей подмаски. Условные подмаски имеют две допустимые формы использования:

(?(condition)yes-pattern)В случае выполения условия condition, используется подмаска yes-pattern
(?(condition)yes-pattern|no-pattern)В случае выполения условия condition, используется подмаска yes-pattern, в противном случае no-pattern

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

( \( )? [^()]+ (?(1) \) )

Первая часть соответствует опциональной открывающей скобке, и в случае если она присутствует, захватывает ее как значение первой подмаски.

Следующая часть соответствует одному или более символам, отличным от круглой скобки.

Третья часть является условной подмаской, зависящей от результата сопоставления первой подмаски. В случае, если в начале обрабатываемых данных была обнаружена открывающая круглая скобка, условие будет интерпретировано как истина, и, следовательно, для успешного сопоставления третьей части шаблона необходима закрывающая круглая скобка. В противном случае, поскольку не указана вторая ветвь условного шаблона, третья часть будет сопоставлена с пустой строкой. Суммируя все вышесказанное, приведенный шаблон совпадает с последовательностью не-скобок, возможно, заключенной в круглые скобки.

Если условием является строка (R), оно будет выполнено, если будет произведен рекурсивный вызов к шаблону или подмаске. На "самом верхнем уровне" условие ложно.

Если условие не является последовательностью цифр или (R), оно должно быть утверждением. Это может быть либо положительная или отрицательная проверка последующего либо предыдущего текста. Рассмотрим данный шаблон, снова содержащий незначащие пробелы, с двумя альтернативами на второй строке:

(?(?=[^a-z]*[a-z])

\d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )

Приведен пример с утверждающим условием касательно предшествующего текста, которое выполняется для необязательной последовательности не-букв с последующей буквой. Говоря другими словами, указанное условие проверяет наличие хотя бы одной предшествующей буквы. В случае, если буква найдена, выполняется сопоставление с первой альтернативой, в противном случае - со второй альтернативой. Приведенный шаблон соответствует строкам двух видов: dd-aaa-dd либо dd-dd-dd, где aaaa - это буквы, а dd - цифры.

Комментарии

Служебная последовательность (?#обозначает начало комментария, который продолжается до ближайшей закрывающей скобки. Вложенные скобки не допускаются. Символы, находящиеся внутри комментария, не принимают участия в сопоставлении шаблона.

PHP функции по работе с регулярными выражениями

  • preg_grep - Возвращает массив вхождений, которые соответствуют шаблону
  • preg_match - Выполняет проверку на соответствие регулярному выражению
  • preg_match_all - Выполняет глобальный поиск шаблона в строке
  • preg_replace - Выполняет поиск и замену по регулярному выражению
  • preg_replace_callback - Выполняет поиск по регулярному выражению и замену
  • preg_split - Разбивает строку по регулярному выражению
  • preg_quote - Экранирует символы в регулярных выражениях

  1. Регулярные выражения
  2. Примеры
  3. RegExp