Регулярные выражения
Регулярное выражение – это представленная в виде формулы алгебраическая запись множества символьных слов, в которой чередуются знаки регулярных операций и символы конечного алфавита. Регулярные выражения являются мощным средством текстового поиска. Они широко используются при работе в операционных системах UNIX и Linux для фильтрации текстовых файлов или выходных данных команд.
Базовый набор для конструирования регулярных выражений образуют три регулярных операции:
· объединение (|);
· конкатенация;
· итерация (*? + {}).
Операция объединения обеспечивает возможность выбора одной из двух альтернатив. Она обозначается знаком | и имеет смысл логического оператора ИЛИ, обеспечивая выбор одной из двух возможных альтернатив: первая из них указывается слева от знака операции, вторая – справа.
Операция конкатенации заключается в слиянии символов шаблона в единую цепочку (последовательность литералов). В регулярных выражениях знак конкатенации как таковой отсутствует. Реализуется конкатенация путем последовательного написания объединяемых символов без пробелов и иных специальных символов.
Операция итерации обеспечивает повторение символа или слова произвольное число раз (от нуля до бесконечности).
Общие сведения о регулярных выражениях
Элементы регулярных выражений
В состав регулярных выражений входят два типа элементов: обычные текстовые символы (литералы) и управляющие символы (метасимволы), обозначающие регулярные операции и выполняющие служебные функции.
Существует международный стандарт POSIX который определяет базовый (BRE) и расширенный (ERE) наборы метасимволов в регулярных выражениях.
|
В расширенный набор метасимволов включены:
$. '' * [ ] () ^ | \ +?
Все прочие символы, не входящие в вышеуказанный список (например, буквы или цифры), рассматриваются в регулярных выражениях как обычные символы и интерпретируются согласно их кодам ASCII.
В особую группу символов входит пробел. Они не может быть использован в регулярных выражениях как обычный символ в виду особенности его интерпретации как знака-разделителя.
Литералы и литеральные константы в регулярных выражениях
В простейшем случае регулярное выражением может состоять только из текстовых символов, например,
UNIX
Формально к буквам данного выражения применяется команда конкатенации (слияния), знак которой опущен между буквами слова. Данному регулярному выражению будет соответствовать последовательность букв U, N, I и X, расположенных в том же порядке, что и в регулярном выражении.
Наряду с литералами в регулярных выражениях могут быть использованы литеральные константы. Обычно они используются для включения в состав выражения неотображаемых символов. Например, литеральная константа \n обозначает перевод строки, а \t – горизонтальную табуляцию.
Экранирование метасимволов
На практике зачастую возникает ситуация, когда в регулярных выражениях метасимволы необходимо использовать как литералы (то есть как обычные символы), например, когда такие символы ищутся в тексте. В этом случае их необходимо «экранировать» в шаблоне при помощи обратной косой черты \. Постановка данного символа отменяет действие следующего за нем специального символа (одного). Например, шаблон
|
3\.14
соответствует поиску последовательности символов 3.14 (в регулярных выражениях метасимвол. соответствует произвольному символу).
Экранирование также может быть использовано для включения в состав регулярного выражения символа пробела. Включение пробела в состав регулярных выражений непосредственно запрещено, так как пробел будет интерпретирован командой как окончание выражения, первая его часть будет отнесена к шаблону, а последующая (или последующие) – к аргументам команды.
Так, для поиска последовательности символов OS UNIX необходимо задать регулярное выражение
OS\ UNIX
Если требуется экранировать группу символов, то одна должна быть заключена в двойные кавычки. Так, регулярное выражение
C''++''
удовлетворяет поиску последовательности символов C++, в которой метасимволы + теряют свое специальное значение.
Следует отметить, что экранированы могут быть не только специальные символы, то и вся строка. Конечно, экранирование литералов не является обязательным, но допустимо. Так регулярные выражения C\+\+, C''++'' и ''С++'' эквивалентны.
Метасимволы и операторы в регулярных выражениях
В таблице 2.1 приведены метасимволы и операторы, используемые в регулярных выражениях.
Таблица 2.1