2016-04-23 3 views
4

У меня есть строка ввода, например 051916.000. Я хотел бы выделить 05, 19, 16 и 000. Я пытаюсь использовать regexec таким образом на языке С.Группирование при использовании 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 in C. Поэтому я не уверен, где я ошибаюсь. Regex проверяется, и он правильно соответствует.

ответ

4

Есть некоторые незначительные ошибки здесь:

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);