C++で淡々とregex.hを使ってみた その2

続いてregexecで実際に正規表現をあててみよう.

#include <regex.h>
#include <iostream>

int main(void)
{
    char target[] = "abcdefghijklhmopqrstuvwxyz";

    regex_t reg;
    int errcode = regcomp(&reg, "ijl", REG_EXTENDED);
    if (errcode != 0)
    {   
        char errbuf[100];
        regerror(errcode, &reg, errbuf, sizeof(errbuf));
        std::cout << "regcompile error: " << errbuf << std::endl;
        regfree(&reg);
        return 1;
    }

    regmatch_t match;
    errcode = regexec(&reg, target, 1, &match, 0);
    if (errcode != 0)
    {   
        char errbuf[100];
        regerror(errcode, &reg, errbuf, sizeof(errbuf));
        std::cout << "regexec error: " << errbuf << std::endl;
        regfree(&reg);
        return 1;
    }

    regfree(&reg);
    return 0;
}

エラーが出た場合の扱いはregcompileと同じ. ただし, パターンが発見出来なかった場合もエラー扱い(REG_NOMATCH). "regexec error: No match"となるはず.

regexecの第4引数はregmatch_tの配列を受けとることになっている. 第3引数はその格納数である. これはパターンが"()"で囲まれたグループを用いた場合に必要らしい. グループはPOSIX拡張でサポートされている.