Разработка приложений в среде Linux. Второе издание
Шрифт:
Часть IV
Библиотеки для разработки
Глава 23
Сопоставление строк
Осуществлять сравнение строк можно не только с помощью функции
23.1. Универсализация произвольных строк
В главе 14 мы говорили о том, как с помощью функции
Предложенный шаблон является стандартным выражением универсализации с четырьмя специальными символами, за которые отвечает аргумент
* | Соответствует любой строке, включая пустую. |
? | Соответствует любому одиночному символу. |
[ | Начинает список символов для сопоставления или, если следующим символом является ^ , то список символов для несовпадения. Весь список может совпадать, или не совпадать с одним символом. Список заканчивается знаком ] . |
\ | Следующий символ будет интерпретироваться как литерал, а не как специальный символ. |
На результаты универсализации влияет аргумент
FNM_NOESCAPE | Обработка символа \ как обычного, а не специального символа. |
FNM_PATHNAME | Символы / в строке string не сопоставляются с последовательностью * , ? , или даже [/] в шаблоне pattern ; сопоставление производится только с литералом, а не специальным символом / . |
FNM_NOESCAPE | Первый символ . в шаблоне pattern соответствует символу . в строке string только в том случае, если он является первым символом в строке string или если задано значение FNM_PATHNAME , а символ . в string непосредственно следует за символом \ . |
Функция
Пример использования функции
23.2. Регулярные выражения
Регулярные выражения, используемые в программах
23.2.1. Регулярные выражения в Linux
Существуют две разновидности регулярных выражений: базовые регулярные выражения (basic regular expression — BRE) и расширенные регулярные выражения (extended regular expression — ERE). Они соответствуют (в первом приближении) командам grep и egrep. Описание каждой разновидности регулярных выражений можно найти на man-странице grep, в стандарте POSIX.2 (IEEE, 1993), в [32], а также в других источниках, поэтому здесь мы не станем описывать их синтаксис, а рассмотрим только интерфейс функции, с помощью которой вы сможете применять регулярные выражения в своих программах.
23.2.2. Сопоставление с регулярными выражениями
Стандарт POSIX определяет четыре функции обработки регулярных выражений.
Прежде чем сравнивать строку с регулярным выражением, нужно выполнить ее компиляцию с помощью функции
Аргумент
REG_EXTENDED | Вместо синтаксической структуры BRE будет использоваться структура ERE. |
REG_ICASE | Не будет учитываться регистр. |
REG_NOSUB | Не будут выделяться подстроки. Функция regexec будет игнорировать аргументы nmatch и pmatch . |
REG_NEWLINE | Если значение REG_NEWLINE не будет задано, то символ новой строки будет обрабатываться точно так же, как и любой другой символ. Символы ^ и $ соответствуют только началу и концу всей строки, а не соседним символам новой строки. Если значение REG_NEWLINE будет задано, то результат будет таким же, как и в случае использования grep , sed и других стандартных системных инструментальных средств; символ ^ осуществляет привязку к началу строки и символу, следующему после символа новой строки (фактически он соответствует строке нулевой длины, следующей за символом новой строки); $ осуществляет привязку к концу строки и символу, следующему после символа новой строки (фактически, он соответствует строке нулевой длины, предшествующей символу новой строки); символ . не соответствует символу новой строки. |