4

のような入力文字列があります051916.000051916およびを分離したいと思い000ます。私はregexecC言語でこのように使用しようとしています。

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

1 に答える 1

4

ここにいくつかの小さなエラーがあります:

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

先頭にスラッシュがあります。ここでの正規表現は、周囲のスラッシュなしで構成されています。それを除く。

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

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

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);
于 2016-04-23T06:35:15.227 に答える