REGEX(3) | Linux Programmer's Manual | REGEX(3) |
regcomp, regexec, regerror, regfree - POSIX regex 関数
#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);
regcomp() は、正規表現をコンパイルして、 regexec() での検索処理に適合する形態にする。
regcomp() はパターンを記憶するバッファーへのポインター preg、 ヌル文字で終端された文字列 regex、 そしてコンパイルの形式を決めるためのフラグ cflag を引数に伴う。
全ての正規表現検索は、コンパイルされたパターンによって行わなければならない。 よって、 regexec() に指定するのは、必ず (regcomp() によってコンパイルされた) パターンバッファーへのアドレスでなければならない。
cflags には、以下に示す定数のうち 0 個以上をビットごとの OR (bitwise-or) で指定する。
regexec() は、 プリコンパイルされたパターンバッファー preg をヌル文字で終端された文字列にマッチさせる。 nmatch と pmatch はマッチングの位置に関する情報を取得するのに用いられる。 eflags には、以下のフラグのうち 0 個以上をビットごとの OR (bitwise-or) で指定する。
パターンバッファーのコンパイル時に REG_NOSUB が設定されない場合は、マッチング位置情報を得ることができる。 pmatch は、少なくとも nmatch の大きさを持つように指定しなければならない。 regexec() の実行によって、それらに部分文字列マッチング位置情報が代入される。 i 番目の括弧で始まる部分正規表現のオフセットは pmatch[i] に格納される。正規表現全体のマッチアドレスは pmatch[0] に格納される。 (N 個の部分正規表現のマッチのオフセットを返すためには、 nmatch は最低限 N+1 でなければならない点に注意すること。) 未使用の構造体要素には -1 が値として代入される。
pmatch の型である regmatch_t 構造体は、 <regex.h> 内で定義される。
typedef struct { regoff_t rm_so; regoff_t rm_eo; } regmatch_t;
構造体要素 rm_so の値が -1 でない場合、それは文字列内での次の最大のマッチング部分の開始 オフセット位置を示す。それに対し、構造体要素 rm_eo はマッチング部分の終了オフセット位置を示し、 マッチング部分の直後の文字のオフセット位置が使用される。
regerror() は、 regcomp() と regexec() の実行によって得られるエラーコードから、エラーメッセージ文字列を 得るのに用いられる。
regerror() はエラーコード errcode、 パターンバッファー preg、 文字列バッファーへのポインター errbuf、 文字列バッファーのサイズ errbuf_size を引数にとる。 この関数は、ヌル文字で終端されたエラーメッセージ文字列を格納するのに必要な errbuf のサイズを返す。もし errbuf と errbuf_size の両方が非 0 値であれば、 errbuf には最初の errbuf_size - 1 文字分にエラーメッセージと終端のヌルバイト ('\0') が収まるように代入される。
引数にコンパイルされたパターンバッファー preg を与えて regfree() を呼び出すと、 regcomp() によるコンパイル時にパターンバッファーに割り当てられたメモリーが解放される。
regcomp() は、コンパイルの成功時には 0 を返し、失敗時にはエラーコードを返す。
regexec() は、マッチングの成功時には 0 を返し、失敗時には REG_NOMATCH を返す。
regcomp() は以下のエラーを返す。
この節で使用されている用語の説明については、 attributes(7) を参照。
インターフェース | 属性 | 値 |
regcomp(), regexec() | Thread safety | MT-Safe locale |
regerror() | Thread safety | MT-Safe env |
regfree() | Thread safety | MT-Safe |
POSIX.1-2001, POSIX.1-2008.
#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <regex.h> #define ARRAY_SIZE(arr) (sizeof((arr)) / sizeof((arr)[0])) static const char *const str = "1) John Driverhacker;\n2) John Doe;\n3) John Foo;\n"; static const char *const re = "John.*o"; int main(void) { static const char *s = str; regex_t regex; regmatch_t pmatch[1]; regoff_t off, len; if (regcomp(®ex, re, REG_NEWLINE)) exit(EXIT_FAILURE); printf("String = \"%s\"\n", str); printf("Matches:\n"); for (int i = 0; ; i++) { if (regexec(®ex, s, ARRAY_SIZE(pmatch), pmatch, 0)) break; off = pmatch[0].rm_so + (s - str); len = pmatch[0].rm_eo - pmatch[0].rm_so; printf("#%d:\n", i); printf("offset = %jd; length = %jd\n", (intmax_t) off, (intmax_t) len); printf("substring = \"%.*s\"\n", len, s + pmatch[0].rm_so); s += pmatch[0].rm_eo; } exit(EXIT_SUCCESS); }
grep(1), regex(7)
glibc マニュアルのセクション Regular Expressions
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2020-08-13 | GNU |