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
 - 
regex に POSIX 拡張正規表現を使用する。もしこのフラグが設定されない場合、 POSIX 標準正規表現が使われる。
 - REG_ICASE
 - 
大文字小文字の違いを無視する。このフラグを指定してコンパイルされた パターンバッファーを用いて regexec()
関数を呼び出すと、大文字小文字の区別を付けずに検索が行われる。
 - REG_NOSUB
 - 
マッチの場所を報告しない。渡されたパターンバッファーがこのフラグを設定してコンパイルされていた場合、 regexec() の引数
nmatch, pmatch が無視される。
 - REG_NEWLINE
 - 
全ての文字にマッチするオペレータに改行をマッチさせない。
 - 
改行を含まない非マッチング文字リスト ([ha...])  に改行をマッチさせない。
 - 
regexec()  の実行時に指定するフラグ eflags に REG_NOTBOL
を含むかどうかにかかわらず、行頭にマッチするオペレータ (ha)  を改行直後の空文字列にマッチさせる。
 - 
eflags に REG_NOTEOL を含むかどうかにかかわらず、行末にマッチするオペレータ ($)
を改行直前の空文字列にマッチさせる。
 
 
POSIX regex マッチング
regexec()  は、 プリコンパイルされたパターンバッファー preg をヌル文字で終端された文字列にマッチさせる。
nmatch と pmatch はマッチングの位置に関する情報を取得するのに用いられる。 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 のサイズを返す。もし errbuf と
errbuf_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 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/ に書かれている。
 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