Модуль regex.h в C и регулярные выражения

Автор: Кирилл, 20 лет, студент школы 21 и Вологодского университета, обучаюсь на программиста.

Введение

Регулярные выражения — инструмент для работы с текстом. В языке C, в стандартной библиотеке для их обработки используется модуль regex.h, предоставляющий разработчикам базовый функционал для поиска, сопоставления и обработки строк.

Что такое регулярные выражения?

Регулярные выражения (RegEx) — это язык шаблонов, предназначенный для описания последовательностей символов. С их помощью можно проверять строки на соответствие шаблону(как по трафарету), извлекать из них нужные данные или заменять определённые части текста.

Модуль regex.h: обзор

Основные функции:

  • regcomp — компиляция (создание) регулярного выражения.
  • regexec — проверка строки на соответствие шаблону.
  • regfree — освобождение памяти после работы с регулярными выражениями.

Основные типы данных:

  • regex_t - используется для хранения скомпилированного выражения.
  • regmatch_t — описывает совпадения (позиции начала и конца).

Функция для создания регулярного выражения, при успехе возвращает 0. Принимает 3 аргумента:

regcomp(®ex, expression, flag);

  1. regex - указатель на ячейку в памяти, где будет сохраняться рег. выражение
  2. expression - строка, которая компилируется в регулярное выражение
  3. flag для указания типа компиляции

Виды Флажков:

  • REG_EXTENDED - расширенный функционал для использования регулярных выражений
  • REG_ICASE - игнорирует различия регистра
  • REG_BASIC(обычно - 0) - базовый функционал регулярных выражений(+ и ? считаются обычными символами)

Функция, выполняющая поиск в строке по шаблону, при совпадении возвращает 0, иначе - REG_NOMATCH. 5 аргументов:

int regexec(const regex_t *regex, const char *string, size_t nmatch, regmatch_t pmatch[], int flags);

  1. regex - шаблон.
  2. string - строка, в которой происходит поиск.
  3. nmatch - количество элементов в массиве pmatch(сколько подстрок надо найти) / 0 - если не нужна инфа о подстроках.
  4. pmatch - Массив структур типа regmatch_t, в котором каждый элемент - совпадение: pmatch.rm_so - начало совпадения (индекс); pmatch.rm_eo - конец совпадения (индекс), Null - если не нужен.
  5. flags - влияет на поведение функции, обычно 0.

regfree(®ex) — освобождение ресурсов, занятых компилированным регулярным выражением.

#include <stdio.h> #include <regex.h> int main() { char * string = "hello 11111 world"; regex_t regex[2];//создается массив для регулярных выражений regcomp(&regex[0], "hello", 0);//создание первого регулярного выражения regcomp(&regex[1], "world", 0);//второго regmatch_t match;//переменная для отлова совпадений for (int i = 0; i < 2; i++) { if (regexec(&regex[i], string, 1, &match, 0) == 0) {//ищет совпадения printf("%.*s ", match.rm_eo - match.rm_so, string + match.rm_so); //hello world } } for (int i = 0; i < 2; i++) regfree(&regex[i]); //освобождение ресурсов return 0; }

как работает строчка с выводом:вместо звездочки подставляется число(разница между началом совпадения и концом), которое ограничивает вывод; затем указатель на строку, который сдвигается на начало совпадения.

Теперь вы знаете, как работать с регулярными выражениями на языке C, как обрабатывать строки с помощью них. Если я допустил ошибку или вам есть что добавить, добро пожаловать в комментарии).

33
реклама
разместить
Начать дискуссию