POSIXの正規表現ライブラリ
正規表現は、そのままパターンマッチに使うのではなく、一度コンパイルして内部表現に変換される。書式は以下の通り。
戻り値が0のとき、コンパイル成功。#include <regex.h> int regcomp(regex_t *preg, char *pattern, int cflags);
- REG_EXTENDED
- 拡張正規表現を使う。
- REG_ICASE
- 英字の大文字・小文字の区別を無視する。
- REG_NOSUB
- regexec()でパターンマッチの成功・失敗のみを返す。
- REG_NEWLINE
- 改行文字の扱いを切り替える。
これが指定された場合、改行文字は普通の文字としては扱われなくなる。
例えばパターンがABC.*Aで文字列がABCD\nABCDだった場合、この指定があるとマッチしないが、指定がないとABCD\nAにマッチする。
regcomp()でコンパイルされた正規表現を使ってパターンマッチを行う。書式は以下の通り。
戻り値が0のとき、パターンマッチ成功。int regexec(regex_t *preg, char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
- REG_NOTBOL
- 文字列の最初の文字を行の先頭にしない。
よって^は通常はマッチしないが、REG_NEWLINEが指定されていて文字列の中に改行文字が含まれている場合、改行文字の次が行の先頭とされるので、マッチする。- REG_NOTEOL
- 文字列の最後の文字を行の末尾にしない。
よって$は通常はマッチしないが、REG_NEWLINEが指定されていて文字列の中に改行文字が含まれている場合、改行文字の前が行の末尾とされるので、マッチする。
pregの中にはregcomp()で確保したエリアがあるので、それを開放する。書式は以下の通り。
void regfree(regex_t *preg);
regcomp()、regexec()は戻り値が0以外のときはエラーコードとなっている。このエラーコードから英文のエラーメッセージに変換することができる。書式は以下の通り。
戻り値は変換された文字列の長さ。size_t regerror(int errcode, regex_t *preg, char *errbuf, size_t errbuf_size);