plucky (3) regerror.3.gz

Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       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) を参照。

       ┌─────────────────────┬───────────────┬────────────────┐
       │インターフェース属性             │
       ├─────────────────────┼───────────────┼────────────────┤
       │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(&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/ に書かれている。