名称
regcomp(), regerror(), regexec(), regfree() ― 正規表現の照合 (マッチング) ルーチン
構文
#include <regex.h>
int regcomp(regex_t *preg, const char *pattern, int cflags);
int regexec(
const regex_t *preg,
const char *string,
size_t nmatch,
regmatch_t pmatch[],
int eflags
);
void regfree(regex_t *preg);
size_t regerror(
int errcode,
const regex_t *preg,
char *errbuf,
size_t errbuf_size
);
説明
これらの関数は、 regexp(5) で述べられている正規表現を変換します。
これらは、 基本 正規表現および 拡張 正規表現の両方をサポートしています。
構造体 regex_t および regmatch_t は、いずれもヘッダー <regex.h>
で定義されています。
構造体 regex_t は、少なくとも以下のメンバーを含んでいます
(他のメンバーを使用すると、互換性のないコードが発生します)。
| size_t re_nsub | | かっこで囲まれた部分式の数 |
構造体 regmatch_t は、少なくとも以下のメンバーを含みます。
| regoff_t rm_so | | 文字列の始まりからサブストリングの始まりまでの、オフセットのバイト数 |
| regoff_t rm_eo | | 文字列の始まりから、サブストリングが終わった次の文字までの、オフセットのバイト数 |
regcomp() は、 pattern で指定した正規表現をコンパイルし、その結果を preg が指す位置に置きます。 引き数 cflags は、以下のフラグ (<regex.h>
で定義) のうち、0 個以上をビットごとの論理 OR でつないだものです。
| REG_EXTENDED | | 拡張正規表現を使用 |
| REG_NEWLINE | | cflags で REG_NEWLINE が 立っていない場合、 pattern または string の中のニューライン文字は、普通の文字として扱われます。 REG_NEWLINE が立てられている場合、以下の場合を除き、ニューライン文字は普通の文字として扱われます。 | 1. | | string の中のニューライン文字は、 ブラケットに囲まれた式の外側のピリオドおよび任意の不一致表現にはマッチしません。 | | 2. | | REG_NOTBOL の設定いかんにかかわらず、 pattern の中で、式の固定 を表すのに使われたサーカムフレクス
(^) は、 string のニューライン文字の直後の、長さ 0 の文字列にマッチします。 | | 3. | | REG_NOTEOL の設定いかんにかかわらず、 pattern の中で、式の固定を表すのに使われたドル符号 ($) は、 string のニューライン文字の直前の、長さ 0 の文字列にマッチします。 |
|
| REG_ICASE | | 照合の際、大文字/小文字を区別しません。 pattern に含まれる文字に対して、現在の LC_CTYPE locale
で、1 つまたは複数の大文字/小文字の対が定義されている場合、指定した文字と、その対の両方が照合の対象になります。
これは、バックリファレンス式 (\n) を通して照合されるように指定された文字を含め、パターンのすべての部分について適用されます。 ブラケットに囲まれた式については、 照合範囲、文字クラス、および等価クラスは、効果的に拡張され、照合要素や照合文字の等価リストが作られます。
1 つ 1 つの照合要素および文字に対しては、大文字/小文字の対が作られ、ブラケットに囲まれた式に対する完全な一致リストもしくは不一致リストが作成されます。
複数の文字からなる照合要素に対する大文字/小文字の対は、照合要素に含まれる個々の文字に対する大文字/小文字の対の、すべての可能な組み合わせからなります。
これら個々の文字は結合され、有効な複数の文字からなる新しい照合要素になります。
たとえば、 [.ch.] に対する大文字/小文字の対としては、 [.Ch.], [.cH.],
および [.CH.] が考えられます。 |
デフォルトで、 pattern の正規表現の型は基本正規表現です。 アプリケーションにでは、 cflags 値、 REG_EXTENDED を使うことで、拡張正規表現に指定できます。
regcomp() は、正常終了すると 0 を返します。失敗するとエラーを示す 0 でない値を返します。
cflags 内に REG_NOSUB フラグが立てられていなかった場合に regcomp() が正常終了すると、 regcomp() は、 re_nsub の値を、 pattern 内の、かっこで囲まれた部分式 (基本正規表現では、 \( と \) によって、また、拡張正規表現では、 ( と ) によって囲まれます)
の数に設定します。
regexec() は前 regcomp() を呼び出した際に初期化され、コンパイルされた正規表現 preg に対して、 string で指定した null で終わる文字列をマッチさせます。
マッチするものが見つかった場合、 regexec() は、0 を返します。失敗の場合には、マッチするものが見つからなかったか、エラーが発生したかを示す 0 でない値を返します。
引き数 eflags は、以下のフラグの、ビットごとの論理和です。
| REG_NOTBOL | | string で指している文字列の最初の文字が、行の先頭でないことを表します。
したがって、サーカムフレクス文字 (^) は、特殊文字として扱われた場合、絶対に一致しません。 |
| REG_NOTEOL | | string で指している文字列の最後の文字が、行の終りでないことを表します。
したがって、ドル符号 ($) は、特殊文字として扱われた場合、絶対に一致しません。 |
nmatch が 0 でなく、 regcomp() の引き数 cflags 内に REG_NOSUB が立てられていない場合、 regexec() は、 pattern のかっこで囲まれた部分式に対応する、 string のサブストリングに対するオフセットのバイト数で配列 pmatch を埋めます。 pmatch[i].rm_so は、サブストリング i の始まりのオフセットバイト数、 pmatch[i].rm_eo は、サブストリング i の終りに 1 バイト足したオフセットバイト数を表します
(部分式
i は、1 から数えて i 番目の左かっこで始まります)。 pmatch[0] のオフセットは、正規表現の全長に対応するサブストリングを表します。 pmatch の未使用の要素は、-1 にセットされます。 pattern 内に、 nmatch より多くの部分式がある場合も regexec() は照合を行いますが、最初の nmatch 個のサブストリングしか登録しません pattern そのものも部分式として数えられます)。
正規表現の照合を行うとき、 pattern で与えられる、かっこで囲まれた任意の部分式は、 string の中の、複数の異なるサブストリングと一致するかもしれません。あるいは、全体としてのパターンが一致している場合ですら、単独ではどのサブストリングとも一致しない場合もあります。
以下で、正規表現の照合を行う場合に、どのサブストリングが pmatch で報告されるかを説明します。
| 1. | | 正規表現の中の部分式 i が、別の部分式内にはなく、複数個のサブストリングと一致した場合、 pmatch[i] に格納されるオフセットバイト数は、最後に一致したときのものです。 |
| 2. | | 部分式 i が、別の部分式内にはなく、 (*, ?,
または | が使われたために) 一度もサブストリングと一致しなかった場合、 pmatch[i] のオフセットバイト数は -1 にセットされます。 |
| 3. | | 部分式 i が部分式 j に含まれており、部分式 j に関する一致が pmatch[j] で報告されている場合、その pmatch[j] で報告されている部分式内で、最後に部分式 i と一致した場合が pmatch[i] で報告されます。 |
| 4. | | 部分式 i が部分式 j に含まれており、 pmatch[j] のオフセットが -1 の場合、 pmatch[i] のオフセットも -1 になります。 |
| 5. | | 部分式 i が、長さ 0 の文字列と一致した場合、 pmatch[i] の 2 つのオフセットは、いずれもその長さ 0 のサブストリングに関するものになります。 |
regcomp() への呼び出しで cflags 内に REG_NOSUB が立てられており、 regexec() への呼び出しで nmatch が 0 でない場合、配列 pmatch の内容は不定です。
regfree() は、 preg に対する regcomp() によって割り当てられたメモリーをすべて解除します。
regexec() または regfree() への引き数 preg が、 regcomp() によって返された、コンパイル済みの正規表現でない場合、 regexec() または regfree() の結果は未定義です。 regfree() にいったん引き渡されると、 preg は、コンパイル済みの正規表現として扱われなくなります。
regerror() は、 regcomp() および regexec() によって返されるエラーコードから、印字できる文字列へのマッピングを提供します。 regerror() は、与えられた preg の値によって regcomp() または regexec() が最後に返した 0 でない値である、 errcode パラメータの値に対応する文字列を生成します。 errcode パラメータは、 <regex.h>
で定義されたエラー値をすべて取ることができます。 errbuf_size が 0 でない場合、 regerror() は、 errbuf で指定されたバッファーに、適当なエラーメッセージをコピーします。
エラーメッセージ (終りの null を含む) が、バッファー内に納まらない場合、 errbuf_size - 1 バイトに切り捨てられ、null で終了します。
errbuf_size が 0 の場合、 errbuf パラメータは無視されますが、戻り値は以下の定義とおりになります。
regerror() は、エラーメッセージ全体
(終りの null を含む) を格納するのに必要なバッファーの大きさを返します。
多言語化対応
ロケール
正規表現をコンパイルし、実行するのに用いられる照合過程は、 LC_COLLATE カテゴリに依存します。
LC_CTYPE カテゴリは、テキストを、シングルバイトかマルチバイト文字、もしくはその両方として変換するかどうか、また正規表現の文字クラス式によってどの文字が照合されるか、各文字の大文字/小文字の対がどの文字であるかを決定します。
サポートされるコードセット
シングル/マルチバイトの文字コードセットがサポートされています。
ただし、 LC_COLLATE と LC_CTYPE 変数に同じベースコードセットに基づいていないロケールカテゴリが指定されている場合、 regcomp() の動作は不定です。
戻り値
regcomp() は、正常終了すると 0 を返し、無効な表現によるものを含む失敗に対しては 0 でない値を返します。 regexec() は、マッチすると 0 を返し、マッチしないか、またはその他のエラーに対しては 0 でない値を返します。
エラー
regcomp() および regexec() は、以下に記されたエラー状態に陥るとそのエラーに対応する 0 でないエラーコードを返します。エラーコードはヘッダー <regex.h>
で定義されています。
| REG_BADBR | | \{ (バックスラッシュ、左中かっこ)
と \} (バックスラッシュ、右中かっこ)
との間の内容が無効。すなわち、数以外のもの、大きすぎる数、3 つ以上の数が含まれているか、最初の数が 2 番目の数よりも大きい場合 |
| REG_BADPAT | | 無効な正規表現 |
| REG_BADRPT | | ? (疑問符)、 * (アスタリスク)、または + (正符号)
の前に有効な正規表現がない場合 |
| REG_EBRACE | | 使用している \{ (バックスラッシュ、左中かっこ)
と \} (バックスラッシュ、右中かっこ)
または {} (中かっこ) の数が一致しない場合 |
| REG_EBRACK | | 使用している [ ] (大かっこ)
の数が一致しない場合 |
| REG_EBOL | | ^ (キャレット) アンカーが使用され、それが行の先頭にない場合 |
| REG_ECHAR | | 無効なマルチバイト文字がある場合 |
| REG_ECOLLATE | | 無効な照合要素が参照された場合 |
| REG_ECTYPE | | 参照された文字クラスタイプが無効の場合 |
| REG_EEOL | | $(ドル) アンカーが使用され、それが行末にない場合 |
| REG_EESCAPE | | パターン内で \ が連続している場合 |
| REG_EPAREN | | 使用している \( (バックスラッシュ、左かっこ)
と \) (バックスラッシュ、右かっこ)、または () の数が一致しない場合。 |
| REG_ERANGE | | 範囲指定表現の終点が無効な場合 |
| REG_ESPACE | | メモリー空間が不足している場合 |
| REG_ESUBREG | | \digit 中の数が無効またはエラーの場合 |
| REG_NOMATCH | | regexec() 関数がマッチしなかった場合 |
例
/* match string against the extended regular expression in pattern,
treating errors as no match. Return 1 for match, 0 for no match.
Print an error message if an error occurs. */
int
match(string, pattern)
char *string;
char *pattern;
{
int i;
regex_t re;
char buf[256];
i=regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB);
if (i != 0) {
(void)regerror(i,&re,buf,sizeof buf);
printf( %s\n",buf);"
return(0); /* report error */
}
i = regexec(&re, string, (size_t) 0, NULL, 0);
regfree(&re);
if (i != 0) {
(void)regerror(i,&re,buf,sizeof buf);
printf( %s\n",buf);"
return(0); /* report error */
}
return(1);
}
以下の例では、 REG_NOTBOL フラグを regexec() とともに使って、1 つの行の中で、ユーザーが与えたパターンに一致するすべてのサブストリングを検索する方法を示します。
(void) regcomp(&re, pattern, 0);
/* look for first match at start of line */
error = regexec(&re, &buffer[0], 1, &pm, 0);
while (error == 0) { /* while matches found */
/* find next match on line */
error = regexec(&re, &buffer[pm.rm_eo], 1, &pm, REG_NOTBOL);
}
著者
regcomp(), regerror(), regexec(), regfree() は、OSF
および HP で開発されました。
標準準拠
regcomp(): XPG4, POSIX.2
regerror(): XPG4, POSIX.2
regexec(): XPG4, POSIX.2
regfree(): XPG4, POSIX.2