2016-04-23 9 views
4

私は051916.000のような入力文字列を持っています。 051916000を分けたいと思います。 このように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}} 

私はRegexをPythonで使っています。私はCでRegexを初めて使うので、どこが間違っているのか分かりません。正規表現は検証され、正しく一致します。あなたが先頭のスラッシュを持って

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

答えて

4

は、ここではいくつかのマイナーなエラーがあります。正規表現は周囲のスラッシュなしで構成されています。それを除く。

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

ここでは、空の文字列をパターンとして渡します。もちろん、「パターン」を渡したいと思っています。

regmatch_t pmatch[4]; 

あなたはすべての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);