Linux программирование в примерах
Шрифт:
POSIX определяет два вида регулярных выражений: базовый и расширенный. Программы типа
grep
, sed
и строчный редактор ed
используют базовые регулярные выражения. Программы типа egrep
и awk
используют расширенные регулярные выражения. Следующие функции дают вам возможность использовать в своих программах любой вид. #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)
Компилирует регулярное выражение
regex
во внутреннее представление, сохраняя его в структуре regex_t
, на которую указывает preg
. cflags
контролирует процесс компиляции; ее значение равно 0 или побитовому ИЛИ одного или более флагов из табл. 12.7 int regexec(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags)
Выполняет откомпилированное регулярное выражение в
*preg
в строке string eflags
контролирует способ выполнения; ее значение равно 0 или побитовому ИЛИ одного или более флагов из табл. 12.8. Вскоре мы обсудим другие аргументы. size_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_
'. В табл. 12.7 перечислены флаги для компиляции регулярных выражений с помощью regcomp
. Таблица 12.7. Флаги для
regcomp
| Константа | Значение |
|---|---|
REG_EXTENDED | Использовать расширенные регулярные выражения. По умолчанию используются базовые регулярные выражения |
REG_ICASE | Сопоставление regexec игнорирует
|
REG_NEWLINE | Операторы, заменяющие любой символ, не включают символ конца строки |
REG_NOSUB | Информация о начале и конце вложенною шаблона не требуется (см текст) |
Флаги для сопоставления регулярных выражений с помощью
regexec
приведены в табл. 12.8. Таблица 12.8. Флаги дли
regexec
| Константа | Значение |
|---|---|
REG_NOTBOL | Оператор ^ (начало строки) не сопоставляется |
REG_NOTEOL | Оператор $ (конец строки) не сопоставляется |
Флаги
REG_NEWLINE
, REG_NOTBOL
и REG_NOTEOL
взаимодействуют друг с другом. Это немного запутано, поэтому мы будем продвигаться небольшими шажками. • Когда в
cflags
не включен REG_NEWLINE
, символ конца строки действует в качестве обычного символа. С ним может быть сопоставлен метасимвол '.
' (любой символ), а также дополненные списки символов ('[^...]
'). При этом $
не сопоставляется немедленно с началом вставленного символа новой строки, а ^
не сопоставляется немедленно с его концом. • Когда в
eflags
установлен REG_NOTBOL
, оператор ^
не соответствует началу строки. Это полезно, когда параметр string
является адресом символа в середине сопоставляемого текста. • Сходным образом, когда в
eflags
установлен REG_NOTEOL
, оператор $
не соответствует концу строки. • Когда в
cflags
включен REG_NEWLINE
, то: • Символ конца строки не соответствует '
.
' или дополненному списку символов. • Оператор
^
всегда соответствует положению непосредственно за вставленным символом конца строки независимо от установки REG_BOL
. • Оператор
$
всегда соответствует положению непосредственно перед вставленным символом конца строки независимо от установки REG_EOL
. Когда вы осуществляете построчный ввод/вывод, как в случае с
grep
, можно не включать REG_NEWLINE
в cflags
. Если в буфере несколько строк, и каждую из них нужно рассматривать как отдельную, с сопоставлением ^
и $
, тогда следует включить REG_NEWLINE
. Структура
regex_t
по большей части непрозрачна. Код уровня пользователя может исследовать лишь один член этой структуры; остальное предназначено для внутреннего использования процедурами регулярных выражений:
Поделиться:
Популярные книги
Хозяин Стужи 3
3. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Петля, Кадетский корпус. Книга третья
3. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 4
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Сотник
2. Индийский поход
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Телохранитель Генсека. Том 3
3. Медведев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Газлайтер. Том 5
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Снайпер
3. Жнец
Фантастика:
боевая фантастика
попаданцы
5.60
рейтинг книги
Двойник короля 11
11. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Вперед в прошлое 2
2. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кодекс Охотника. Книга XXVI
26. Кодекс Охотника
Фантастика:
попаданцы
5.00
рейтинг книги
Жертва
2. Звездный Бродяга
Фантастика:
боевая фантастика
космическая фантастика
рпг
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга III
3. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
6.00
рейтинг книги
Проводник
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41