REGEX

Section: Linux Programmer's Manual (3)
Updated: 2020-08-13
Index JM Home Page roff page
 

名前

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
全ての文字にマッチするオペレータに改行をマッチさせない。
改行を含まない非マッチング文字リスト ([ha...]) に改行をマッチさせない。
regexec() の実行時に指定するフラグ eflagsREG_NOTBOL を含むかどうかにかかわらず、行頭にマッチするオペレータ (ha) を改行直後の空文字列にマッチさせる。
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) を参照。
インターフェース属性
regcomp(), regexec() Thread safetyMT-Safe locale
regerror() Thread safetyMT-Safe env
regfree() Thread safetyMT-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(&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/ に書かれている。


 

Index

名前
書式
説明
POSIX regex コンパイル
POSIX regex マッチング
バイトオフセット
POSIX エラーレポート
POSIX パターンバッファー解放
返り値
エラー
属性
準拠
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 16:46:42 GMT, November 24, 2023