Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
echo~arnold/.p*12.8. Регулярные выражения
Регулярные выражения являются способом описания текстовых шаблонов для сопоставления. Если вы вообще сколько-нибудь использовали GNU/Linux или Unix, вы без сомнения знакомы с регулярными выражениями: они являются фундаментальной частью инструментария программиста Unix. Они неотъемлемы от таких повседневных программ, как
grepegrepsedawkedvivimPOSIX определяет два вида регулярных выражений: базовый и расширенный. Программы типа
grepsededegrepawk#include <sys/types.h> /* POSIX */#include <regex.h>int regcomp(regex_t *preg, const char *regex, int cflags);int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);void regfree(regex_t *preg);Чтобы сопоставить регулярное выражение, нужно сначала откомпилировать строчную версию регулярного выражения. Компиляция преобразует регулярное выражение во внутренний формат. Затем откомпилированная форма исполняется для строки для проверки, совпадает ли она с первоначальным регулярным выражением. Функции следующие.
int regcomp(regex_t *preg, const char *regex, int cflags)Компилирует регулярное выражение
regexregex_tpregcflagsint regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags)Выполняет откомпилированное регулярное выражение в
*pregstring eflagssize_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)Преобразует ошибку, возвращенную
regcomp()regexec()void regfree(regex_t *preg)Освобождает динамическую память, используемую откомпилированным регулярным выражением в
*pregЗаголовочный файл
<regex.h>regcomp()regexec()REG_regcomp()Таблица 12.7. Флаги для
regcomp()| Константа | Значение |
|---|---|
REG_EXTENDED | Использовать расширенные регулярные выражения. По умолчанию используются базовые регулярные выражения |
REG_ICASE | Сопоставление regexec() |
REG_NEWLINE | Операторы, заменяющие любой символ, не включают символ конца строки |
REG_NOSUB | Информация о начале и конце вложенною шаблона не требуется (см текст) |
Флаги для сопоставления регулярных выражений с помощью
regexec()Таблица 12.8. Флаги дли
regexec()| Константа | Значение |
|---|---|
REG_NOTBOL | Оператор ^ (начало строки) не сопоставляется |
REG_NOTEOL | Оператор $ (конец строки) не сопоставляется |
Флаги
REG_NEWLINEREG_NOTBOLREG_NOTEOL• Когда в
cflagsREG_NEWLINE.[^...]$^• Когда в
eflagsREG_NOTBOL^string• Сходным образом, когда в
eflagsREG_NOTEOL$