Регулярные выражения в С/С++

Для работы с регулярными выражениями в С/С++ создана библиотека regex.h. В ней предопределены основные функцкии:

#include <regex.h>

int regcomp (regex_t *restrict preg, const char *restrict pattern, int cflags);
int regexec (const regex_t *restrict preg, const char *restrict string, size_t nmatch, regmatch_t pmatch [restrict], int eflags);
void regfree (regex_t *preg);
size_t regerror (int errcode, const regex_t *restrict preg, char *restrict errbuf, size_t errbuf_size);

Функция regcomp предназначена для компиляции регулярного выражения. Эта функция компилирует регулярное выражение pattern учитывая флаги cflags и помещает его в структуру preg.
Флаги могут быть составлены как побитовое или следующих элементов:

  • REG_EXTENDED - использовать расширенные регулярные выражения
  • REG_ICASE - не различать заглавные и строковые буквы при сопоставлении строки с регулярным выражением

Функция regexec сопоставляет регулярное выражение скомпилированное и помещённое в структуру preg со строкой string. При этом в случае успешного сопоставления возвращается нулевое значение, в протичном случае - код ошибки. Аргумент eflags - побитовое ИЛИ REG_NOTBOL и REG_NOTEOL. Они определяет, являются ли границы цепочки границами строки (для обработки фиксаторов ^ и $). Если аргумент nmatch равен нулю, то pmatсh игнорируется, иначе он должен указывать на массив nmatch элементов, который будет заполнен смещениями подцепочек.

Для расшифровки ошибок используется функция regerror(). Она преобразует errcode возвращённый сопоставлением регулярного выражения и строки и помещает строковое значение ошибки в переменную errbuf, при этом следует указывать её размер.

Функция regfree() освобождает память запрошенную при компилировании регулярного выражения. Указатель на структуру регулярного выражения использовать после этого нельзя...

Рассмотрим пример:

#include <iostream>
#include <regex.h>
using namespace std;

#define PATTERN "^[0-9]{0,3}.[0-9]{0,3}.[0-9]{0,3}.[0-9]{0,3}$"
#define STRING "127.0.0.1"

int main() {
    regex_t preg;
    int err,regerr;
    err = regcomp (&preg, PATTERN, REG_EXTENDED);
    if (err != 0) {
        char buff[512];
        regerror(err, &preg, buff, sizeof(buff));
        cout << buff;
    }

    regmatch_t pm;
    regerr = regexec (&preg, STRING, 0, &pm, 0);
    if (regerr == 0) cout << "true"; else {
    cout << "false\n";
    char errbuf[512];
    regerror(regerr, &preg, errbuf, sizeof(errbuf));
    cout << errbuf;
    }
    return 0;
}

Эта функция - простейшая функция для распознания IP адреса. При помощи директивы define мы предоприделили строку с регулярным выражением и строку для проверки. В главной функции прежде всего компилируется регулярное выражение PATTERN и помещается в структуру preg. Сразу проверяем наличие ошибок и если они есть, выводим на экран. После этого сравниваем строку STRING с регулярным выражением в preg. В случае совпадения выводим "true", в противном случае - "false" и расшифровуем ошибку при помощи regerror.

Просмотров:   9284