sourCEntral - mobile manpages

pdf

REGEX

名前

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);

説明

POSIX regex コンパイル
regcomp
() は、正規表現をコンパイルして、 regexec() での検索処理に適合する形態にする。

regcomp() はパターンを記憶するバッファーへのポインター preg、 ヌル文字で終端された文字列 regex、 そしてコンパイルの形式を決めるためのフラグ cflag を引数に伴う。

全ての正規表現検索は、コンパイルされたパターンによって行わなければならない。 よって、 regexec() に指定するのは、必ず (regcomp() によってコンパイルされた) パターンバッファーへのアドレスでなければならない。

cflags には、以下に示す定数のうち 0 個以上をビットごとの OR (bitwise-or) で指定する。
REG_EXTENDED

regexPOSIX 拡張正規表現を使用する。もしこのフラグが設定されない場合、 POSIX 標準正規表現が使われる。

REG_ICASE

大文字小文字の違いを無視する。このフラグを指定してコンパイルされた パターンバッファーを用いて regexec() 関数を呼び出すと、大文字小文字の区別を付けずに検索が行われる。

REG_NOSUB

マッチの場所を報告しない。渡されたパターンバッファーがこのフラグを設定してコンパイルされていた場合、 regexec() の引数 nmatch, pmatch が無視される。

REG_NEWLINE

全ての文字にマッチするオペレータに改行をマッチさせない。

改行を含まない非マッチング文字リスト ([^...]) に改行をマッチさせない。

regexec() の実行時に指定するフラグ eflagsREG_NOTBOL を含むかどうかにかかわらず、行頭にマッチするオペレータ (^) を改行直後の空文字列にマッチさせる。

eflagsREG_NOTEOL を含むかどうかにかかわらず、行末にマッチするオペレータ ($) を改行直前の空文字列にマッチさせる。

POSIX regex マッチング
regexec
() は、 プリコンパイルされたパターンバッファー preg をヌル文字で終端された文字列にマッチさせる。 nmatchpmatch はマッチングの位置に関する情報を取得するのに用いられる。 eflags には、以下のフラグのうち 0 個以上をビットごとの OR (bitwise-or) で指定する。
REG_NOTBOL

行頭にマッチするオペレータは、必ずマッチに失敗する (コンパイル時のフラグ REG_NEWLINE の項目も参照)。 このフラグは、複数行にまたがる文字列を regexec() で検索する際に、文字列の先頭を行の先頭として解釈させない場合に用いる。

REG_NOTEOL

行末にマッチするオペレータは、必ずマッチに失敗する (コンパイル時のフラグ REG_NEWLINE の項目も参照)。

REG_STARTEND

Use pmatch[0] on the input string, starting at byte pmatch[0].rm_so and ending before byte pmatch[0].rm_eo. This allows matching embedded NUL bytes and avoids a strlen(3) on large strings. It does not use nmatch on input, and does not change REG_NOTBOL or REG_NEWLINE processing. This flag is a BSD extension, not present in POSIX.

バイトオフセット
パターンバッファーのコンパイル時に 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 はマッチング部分の終了オフセット位置を示し、 マッチング部分の直後の文字のオフセット位置が使用される。

POSIX エラーレポート
regerror
() は、 regcomp() と regexec() の実行によって得られるエラーコードから、エラーメッセージ文字列を 得るのに用いられる。

regerror() はエラーコード errcode、 パターンバッファー preg、 文字列バッファーへのポインター errbuf、 文字列バッファーのサイズ errbuf_size を引数にとる。 この関数は、ヌル文字で終端されたエラーメッセージ文字列を格納するのに必要な errbuf のサイズを返す。もし errbuferrbuf_size の両方が非 0 値であれば、 errbuf には最初の errbuf_size - 1 文字分にエラーメッセージと終端のヌルバイト ('\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

正規表現のコンパイルに、64 Kb 以上のパターンバッファーが必要。 これは POSIX.2 には定義されていない。

REG_ESPACE

regex ルーチンがメモリーを使いはたしている。

REG_ESUBREG

サブエクスプレッション \(...\) (subexpression) への無効な後方参照。

属性

この節で使用されている用語の説明については、 attributes(7) を参照。

img

準拠

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(&regex, re, REG_NEWLINE))
exit(EXIT_FAILURE);

printf("String = \"%s\"\n", str);
printf("Matches:\n");

for (int i = 0; ; i++) {
if (regexec(&regex, 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/ に書かれている。

pdf