Регулярные выражения
Что такое регулярные выражения
Регулярные выражения (regular expressions, RegExp) - наборы символов, применяемых для поиска текстовых строк, соответствующих требуемым условиям. Результат применения регулярного выражения - подмножество данных, отобранное согласно логике, заложенной в выражении. Регулярные выражения применяются в любых задачах по поиску в множестве данных, для которых нужно получать выжимку по определенным правилам.
Зачем нужны регулярные выражения?
Сравнение с шаблоном: Регулярные выражения отлично помогают определять, соответствует ли строка тому или иному формату - например, телефонному номеру, адресу электронной почты или номеру кредитной карты.
Замена: При помощи регулярных выражений легко находить и заменять шаблоны в строке. Так, выражение text.replace(/\s+/g, " ") заменяет все пробелы в text, например, " \n\t ", одним пробелом.
Извлечение: При помощи регулярных выражений легко извлекать из шаблона фрагменты информации. Например, name.matches(/^(Mr|Ms|Mrs|Dr)\.?\s/i) извлекает из строки обращение к человеку, например, "Mr" из "Mr. Schropp".
- Портируемость: Почти в любом распространенном языке программирования есть своя библиотека регулярных выражений. Синтаксис в основном стандартизирован, поэтому вам не придется переучиваться регулярным выражениям при переходе на новый язык.
- Код: Когда пишете код, можно пользоваться регулярными выражениями для поиска информации в файлах; так, в Atom для этого предусмотрен find and replace, а в командной строке - ack.
- Четкость и лаконичность: Если вы с регулярными выражениями на "ты", то сможете выполнять весьма нетривиальные операции, написав минимальный объем кода.
Синтаксис регулярных выражений
Большинство символов в регулярных выражениях представляют сами себя, за исключением группы специальных символов "[ ] \ / ^ $ . | ? * + ( ) { }". Если эти символы нужно представить в качестве символов текста, их следует экранировать обратной косой чертой "\".
Если эти спецсимволы встречаются без обратной косой черты, значит у них особенные значения в регулярных выражениях:
- "^ " - каретка, циркумфлекс или просто галочка. Начало строки;
- "$ " - знак доллара. Конец строки;
- ". " - точка. Любой символ;
- "* " - знак умножения, звездочка. Любое количество предыдущих символов;
- "+ " - плюс. 1 или более предыдущих символов;
- " ? " - вопросительный знак. 0 или 1 предыдущих символов;
- " ( ) " - круглые скобки. Группировка конструкций;
- "| " - вертикальная линия. Оператор "ИЛИ";
- " [ ] " - квадратные скобки. Любой из перечисленных символов, диапазон. Если первый символ в этой конструкции - "^ ", то массив работает наоборот - проверяемый символ не должен совпадать с тем, что перечислено в скобках;
- "{ }" - фигурные скобки. Повторение символа несколько раз;
- "\ " - обратный слеш. Экранирование служебных символов.
Также существуют специальные метасимволы, ими можно заменить некоторые готовые конструкции:
- \b - обозначает не символ, а границу между символами;
- \d - цифровой символ;
- \D - нецифровой символ;
- \s - пробельный символ;
- \S - непробельный символ;
- \w - буквенный или цифровой символ или знак подчеркивания;
- \W - любой символ, кроме буквенного или цифрового символа или знака подчеркивания.
Введение в синтаксис PCRE
Синтакcис шаблонов, используемых в функциях этого раздела, во многом похож на синтаксис, используемый в Perl. Выражение должно быть заключено в разделители, например, прямые слеши '/'. Разделителем могут выступать произвольные символы, кроме буквенно-цифровых, обратного слеша '\' и нулевого байта. Если символ разделителя встречается в шаблоне, его необходимо экранировать. В качестве разделителя доступны комбинации, используемые в Perl: (), {}, [] и <>.
Далее перечислены все доступные на сегодняшний день модификаторы. Имя, взятое в круглые скобки, указывает внутреннее PCRE-имя для данного модификатора. Пробелы и переводы строк в модификаторах игнорируются, другие символы вызывают ошибки.
i (PCRE_CASELESS)
Если этот модификатор используется, символы в шаблоне соответствуют символам как верхнего, так и нижнего регистра.
m (PCRE_MULTILINE)
По умолчанию PCRE обрабатывает данные как однострочную символьную строку (даже если она содержит несколько разделителей строк). Метасимвол начала строки '^' соответствует только началу обрабатываемого текста, в то время как метасимвол "конец строки" '$' соответствует концу текста, либо позиции перед завершающим текст переводом строки (в случае, если модификатор D не установлен). В Perl ситуация полностью аналогична. Если этот модификатор используется, метасимволы "начало строки" и "конец строки" также соответствуют позициям перед произвольным символом перевода и строки и, соответственно, после, как и в самом начале и в самом конце строки. Это соответствует Perl-модификатору /m. В случае, если обрабатываемый текст не содержит символов перевода строки, либо шаблон не содержит метасимволов '^' или '$', данный модификатор не имеет никакого эффекта.
s (PCRE_DOTALL
Если данный модификатор используется, метасимвол "точка" в шаблоне соответствует всем символам, включая перевод строк. Без него - все символы, кроме переводов строк. Этот модификатор эквивалентен записи /s в Perl. Класс символов, построенный на отрицании, например [^a], всегда соответствует переводу строки, независимо от наличия этого модификатора.
x (PCRE_EXTENDED)
Если используется данный модификатор, неэкранированные пробелы, символы табуляции и пустой строки будут проигнорированы в шаблоне, если они не являются частью символьного класса. Также игнорируются все символы между неэкранированным символом '#' (если он не является частью символьного класса) и символом перевода строки (включая сами символы '\n' и '#'). Это эквивалентно Perl-модификатору /x, и позволяет размещать комментарий в сложных шаблонах. Замечание: это касается только символьных данных. Пробельные символы не фигурируют в служебных символьных последовательностях, к примеру, в последовательности '(?(', открывающей условную подмаску.
e (PREG_REPLACE_EVAL)
Если используется данный устаревший модификатор, preg_replace() после выполнения стандартных подстановок в заменяемой строке интерпретирует ее как PHP-код и использует результат для замены искомой строки. Одинарные и двойные кавычки, обратные слеши (\) NULL-символы будут проэкранированы обратными слешами в подставляемых обратных ссылках.
A (PCRE_ANCHORED)
Если используется данный модификатор, соответствие шаблону будет достигаться только в том случае, если он "заякорен", то есть соответствует началу строки, в которой производится поиск. Того же эффекта можно достичь подходящей конструкцией с вложенным шаблоном, которая является единственным способом реализации этого поведения в Perl.
D (PCRE_DOLLAR_ENDONLY)
Если используется данный модификатор, метасимвол $ в шаблоне соответствует только окончанию обрабатываемых данных. Без этого модификатора метасимвол $ соответствует также позиции перед последним символом, в случае, если им является перевод строки (но не распространяется на любые другие переводы строк). Данный модификатор игнорируется, если используется модификатор m. В языке Perl аналогичный модификатор отсутствует.