regex

[戻る]

概要

POSIXの正規表現ライブラリ

正規表現のコンパイル

正規表現は、そのままパターンマッチに使うのではなく、一度コンパイルして内部表現に変換される。書式は以下の通り。

#include <regex.h>

int regcomp(regex_t *preg, char *pattern, int cflags);
戻り値が0のとき、コンパイル成功。
pregはワークエリア。ここに、コンパイルされた内部表現などが格納される。
patternに正規表現を指定する。
cflagsはコンパイルフラグ。以下のフラグをorで列挙する。
REG_EXTENDED
拡張正規表現を使う。
REG_ICASE
英字の大文字・小文字の区別を無視する。
REG_NOSUB
regexec()でパターンマッチの成功・失敗のみを返す。
REG_NEWLINE
改行文字の扱いを切り替える。
これが指定された場合、改行文字は普通の文字としては扱われなくなる。
例えばパターンがABC.*Aで文字列がABCD\nABCDだった場合、この指定があるとマッチしないが、指定がないとABCD\nAにマッチする。

パターンマッチの実行

regcomp()でコンパイルされた正規表現を使ってパターンマッチを行う。書式は以下の通り。

int regexec(regex_t *preg, char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
戻り値が0のとき、パターンマッチ成功。
pregはregcomp()で作られたワークエリア。
stringはパターンマッチの対象となる文字列。
nmatchはpmatchのサイズ。これが0のときはパターンマッチの成功・失敗のみが返る。 pmatchにマッチした情報が返る。pmatch[0]に正規表現全体のマッチした情報、pmatch[1〜]にはグループのマッチ情報が入る。
例えば、パターンが(aa)(b(bc)(c))(dd)で、文字列がaabbccddeeだった場合、pmatch[0]からはaabbccdd、pmatch[1]からはaa、pmatch[2]からはbbcc、pmatch[3]からはbc、pmatch[4]からはc、pmatch[5]からはddが取り出せる。
preg.re_nsubにはマッチしたグループの数が入る。
pmatch[*].rm_soにはマッチした部分の先頭のオフセット、pmatch[*].rm_eoにはマッチした部分の末尾のオフセットが入る。
eflagsは実行オプション。以下のフラグをorで列挙する。
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);
戻り値は変換された文字列の長さ。
errcodeはエラーコード。
pregはワークエリア。
errbufは変換された文字列が格納されるエリア。
errbuf_sizeは用意したerrbufのサイズ。


Copyright © 1999 by Jun Takahashi