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
文字分にエラーメッセージと終端の
NULL バイト ('\0')
が収まるように代入される。
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)
として有効ではない。
(訳注) 詳細は 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.
関連項目¶
grep(1),
regex(7), GNU regex
マニュアル
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。