2016-04-23 50 views
4

我有一個輸入字符串,如051916.000。我想分開05,19,16000。 我試圖在C語言中以這種方式使用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}} 

我在Python中使用了正則表達式。我對C中的正則表達式很陌生,所以我不確定我出錯的地方。正則表達式已被驗證,並且正確匹配。

回答

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