REGCOMP(3)

名前
regcomp, regexec, regerror, regfree - POSIX regex 関数

書式
#include <regex.h>

int regcomp(regex_t *preg, const char *regex, int cflags); int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags); size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size); void regfree(regex_t *preg);

POSIX REGEX コンパイル
regcomp は、正規表現をコンパイルして、 regexec での検索処理に適合する形態にする。 regcomp はパターンを記憶するバッファへのポインタ preg 、NULLで終端された文字列 regex 、そしてコンパイルの形式を決めるためのフラグ cflag を引数に伴う。 全ての正規表現検索は、コンパイルされたパターンによって行わなければならない。 よって、 regexec に指定するのは、必ず( regcomp によってコンパイルされた)パターンバッファへのアドレスでなければならない。 cflags には以下に示す定数一つ以上のビットごとのOR(bitwise-or)を指定する。

REG_EXTENDED
    regex に POSIX 拡張正規表現を使用する。もしこのフラグが設定されない場合、 POSIX 標準正規表現が使われる。

REG_ICASE
    大文字小文字の違いを無視する。このフラグを指定してコンパイルされた パターンバッファを用いて regexec 関数を呼び出すと、大文字小文字の区別を付けずに検索が行われる。

REG_NOSUB
    このフラグを設定してコンパイルされたパターンバッファが regexec の引数に指定されると、パラメータ nmatch , pmatch が無視される。

REG_NEWLINE
    全ての文字にマッチするオペレータに改行をマッチさせない。 改行を含まない非マッチング文字リスト ([^...]) に改行をマッチさせない。

    regexec の実行時に指定するフラグ eflags に REG_NOTBOL を含むかどうかにかかわらず、行頭にマッチするオペレータ (^) を改行直後の空文字列にマッチさせる。 eflags に REG_NOTEOL を含むかどうかにかかわらず、行末にマッチするオペレータ ($) を改行直前の空文字列にマッチさせる。

POSIX REGEX マッチング
regexec は、 プリコンパイルされたパターンバッファ preg をNULLで終端された文字列にマッチさせる。 nmatch と pmatch はマッチングの位置に関する情報を取得するのに用いられる。 eflags には REG_NOTBOL と REG_NOTEOL のどちらか、もしくは両方の ビットごとのOR(bitwise-or) を指定し、以下で説明するようにマッチング動作を変化させる。

REG_NOTBOL
    行頭にマッチするオペレータは、必ずマッチに失敗する(コンパイル時のフラグ REG_NEWLINE の項目も参照)。 このフラグは、複数行にまたがる文字列を regexec で検索する際に、文字列の先頭を行の先頭として解釈させない場合に用いる。

REG_NOTEOL
    行末にマッチするオペレータは、必ずマッチに失敗する(コンパイル時のフラグ REG_NEWLINE の項目も参照)。

  バイトオフセット
パターンバッファのコンパイル時に REG_NOSUB が設定されない場合は、部分文字列のマッチング位置情報を得ることができる。 pmatch は、少なくとも nmatch の大きさを持つように指定しなければならない。 regexec の実行によって、それらに部分文字列マッチング位置情報が代入される。 未使用の構造体要素には-1が値として代入される。 pmatch の型である regmatch_t 構造体は、 regex.h 内で定義される。
    typedef struct
    {
    regoff_t rm_so;
    regoff_t rm_eo;
    } regmatch_t;
構造体要素 rm_so の値が-1でない場合、それは文字列内での次の最大のマッチング部分の開始 オフセット位置を示す。それに対し、構造体要素 rm_eo はマッチング部分の終了オフセット位置を示す。

POSIX エラーレポート
regerror は、 regcomp と regexec の実行によって得られるエラーコードから、エラーメッセージ文字列を 得るのに用いられる。 regerror はエラーコード errcode 、パターンバッファ preg 、文字列バッファへのポインタ errbuf 、文字列バッファのサイズ errbuf_size を引数にとる。 この関数は、NULLで終端されたエラーメッセージ文字列を格納するのに必要な errbuf のサイズを返す。もし errbuf と errbuf_size の両方が非ゼロ値であれば、 errbuf には最初の errbuf_size - 1 文字分にエラーメッセージと終端NULL文字が収まるように代入される。

POSIX パターンバッファ開放
引数にコンパイルされたパターンバッファ preg を与えて regfree を呼び出すと、 パターンバッファのコンパイル時に確保されたメモリが開放される。

返り値
regcomp は、コンパイルの成功時にはゼロを返し、失敗時にはエラーコードを返す。 regexec は、マッチングの成功時にはゼロを返し、失敗時には REG_NOMATCH を返す。

エラー
regcomp は以下のエラーを返す。

REG_BADRPT
    `*' が最初の文字としてくるような、無効な繰り返しオペレータの使用。

REG_BADBR
    無効な後方参照オペレータの使用。

REG_EBRACE
    インターバルオペレータ {} (brace interval operators)が閉じていない。

REG_EBRACK
    リストオペレータ [] (bracket list operators)が閉じていない。

REG_ERANGE
    無効な範囲オペレータの使用。例えば、範囲の終了位置が開始位置よりも前に あるような場合。

REG_ECTYPE
    無効なキャラクタクラス名。

REG_ECOLLATE
    照合順序の要素(collating element)として有効ではない。 (訳注) 照合順序の要素(collating element)については、 regex(7) を参照。

REG_EPAREN
    グループオペレータ () (parenthesis group operators)が閉じていない。

REG_ESUBREG
    サブエクスプレッション \(...\) (subexpression)への無効な後方参照。

REG_EEND
    未定義エラー。これはPOSIX.2には定義されていない。

REG_EESCAPE
    正規表現がバックスラッシュで終っている。 (訳注) 日本語環境の場合、バックスラッシュとなるべき所が円記号で 表示されることがあるが、これは単に表示フォントの問題で、 内部的には同じ意味である。

REG_BADPAT
    グループやリストなどの、パターンオペレータの無効な使用。

REG_ESIZE
    正規表現のコンパイルに、64Kb以上のパターンバッファが必要。これは POSIX.2には定義されていない。

REG_ESPACE
    regexルーチンがメモリを使いはたしている。

準拠
POSIX.2

バグ
現在のGNU libc(snapshot 980503)の下では、正規表現中に 照合順序の要素(collating elements)を用いることはできない。

関連項目
regex(7), GNU regex マニュアル