名前
regcomp, regexec, regerror, regfree - POSIX regex 関数
書式
#include <sys/types.h> #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、 ヌル文字で終端された文字列 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 をヌル文字で終端された文字列にマッチさせる。 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 を引数にとる。 この関数は、ヌル文字で終端されたエラーメッセージ文字列を格納するのに必要な errbuf のサイズを返す。もし errbuf と errbuf_size の両方が非 0 値であれば、 errbuf には最初の errbuf_size - 1 文字分にエラーメッセージと終端のヌル文字が収まるように代入される。
POSIX パターンバッファ解放
引数にコンパイルされたパターンバッファ preg を与えて regfree() を呼び出すと、 regcomp() によるコンパイル時にパターンバッファに割り当てられたメモリが解放される。
返り値
regcomp() は、コンパイルの成功時には 0 を返し、失敗時にはエラーコードを返す。
regexec() は、マッチングの成功時には 0 を返し、失敗時には REG_NOMATCH を返す。
エラー
regcomp() は以下のエラーを返す。
REG_BADBR | |
無効な後方参照オペレータの使用。 | |
REG_BADPAT | |
グループやリストなどの、パターンオペレータの無効な使用。 | |
REG_BADRPT | |
* が最初の文字としてくるような、無効な繰り返しオペレータの使用。 | |
REG_EBRACE | |
インターバルオペレータ {} (brace interval operators) が閉じていない。 | |
REG_EBRACK | |
リストオペレータ [] (bracket list operators) が閉じていない。 | |
REG_ECOLLATE | |
照合順序の要素 (collating element) として有効ではない。
(訳注) 照合順序の要素 (collating element) については、 regex(7) を参照。 | |
REG_ECTYPE | |
未知のキャラクタクラス名。 | |
REG_EEND | |
未定義エラー。これは POSIX.2 には定義されていない。 | |
REG_EESCAPE | |
正規表現がバックスラッシュで終っている。
(訳注) 日本語環境の場合、バックスラッシュとなるべき所が円記号で 表示されることがあるが、これは単に表示フォントの問題で、 内部的には同じ意味である。 | |
REG_EPAREN | |
グループオペレータ () (parenthesis group operators) が閉じていない。 | |
REG_ERANGE | |
無効な範囲オペレータの使用。 例えば、範囲の終了位置が開始位置よりも前にあるような場合。 | |
REG_ESIZE | |
正規表現のコンパイルに、64Kb 以上のパターンバッファが必要。 これは POSIX.2 には定義されていない。 | |
REG_ESPACE | |
regex ルーチンがメモリを使いはたしている。 | |
REG_ESUBREG | |
サブエクスプレッション \(...\) (subexpression) への無効な後方参照。 | |
準拠
POSIX.1-2001.