Синтаксис регулярных выражений
Вступление
Регулярное выражение
- это шаблон, с которым сравнивается указанная строка слева направо. Большинство символов в шаблоне являются самими собой, и совпадают с соответствующими символами в искомой строке.
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
- Экранирует символы в регулярных выражениях