Группировка при использовании regexec

У меня есть строка ввода, как 051916.000, Я хотел бы отделить 05, 19, 16 а также 000, Я пытаюсь использовать regexec таким образом, на языке Си.

regex_t r;
regmatch_t pmatch[4];
char* pattern = "/([0-9]{2})([0-9]{2})([0-9]{2})\\.(.*)";
int status = regcomp(&r, "", REG_EXTENDED|REG_NEWLINE);
status = regexec(&r, t, 4, pmatch, 0);
regfree(&r);

Но это не похоже на работу. Ниже вывод GDB

(gdb) p pmatch 
$1 = {{rm_so = 0, rm_eo = 0}, {rm_so = -1, rm_eo = -1}, {rm_so = -1, rm_eo = -1}, {rm_so = -1, rm_eo = -1}}

Я использовал Regex в Python. Я новичок в Regex в C. Так что я не уверен, где я иду не так. Регулярное выражение проверено, и оно соответствует правильно.

1 ответ

Решение

Здесь есть несколько мелких ошибок:

char* pattern = "/([0-9]{2})([0-9]{2})([0-9]{2})\\.(.*)";

У тебя ведущий слэш. Регулярные выражения здесь составлены без окружающих слешей; убери это.

status = regcomp(&r, "", REG_EXTENDED|REG_NEWLINE);

Здесь вы передаете пустую строку как шаблон. Вы хотите пройти "образец", конечно.

regmatch_t pmatch[4];

Если вы хотите захватить все четыре подвыражения в квадратных скобках, вы должны передать массив размером 5: pmatch[0] это целое выражение.

Когда вы исправляете это, ваш код работает:

const char *t = "051916.000";
regex_t r;
regmatch_t pmatch[5];
char* pattern = "([0-9]{2})([0-9]{2})([0-9]{2})\\.(.*)";
int status, i;

status = regcomp(&r, pattern, REG_EXTENDED|REG_NEWLINE);
if (status == 0) status = regexec(&r, t, 5, pmatch, 0);

if (status == 0) {
    for (i = 0; i < 5; i++) {
        int len = pmatch[i].rm_eo - pmatch[i].rm_so;
        const char *str = t + pmatch[i].rm_so;

        printf("'%.*s'\n", len, str);
    }
}

regfree(&r);
Другие вопросы по тегам