regexec サブルーチン

目的

レグコンパ ストリングパラメータの値で指定されたヌル文字で終端する文字列と、コンパイル済みの基本または拡張正規表現 '妊娠 を比較する。

ライブラリー

標準Cライブラリ(libc. a)

構文

#include <regex.h>
int regexec (PregStringNMatchPMatchEFlags)
const regex_t * Preg;
const char * String;
size_t  NMatch;
regmatch_t * PMatch;
int  EFlags;

説明

regexecサブルーチンは、Stringパラメータのヌル文字で終端された文字列と、以前にregcompサブルーチンを呼び出すことによって初期化されたPregパラメータのコンパイルされた基本または拡張正規表現とを比較する。 マッチした場合、regexecサブルーチンは値0を返す。 regexecサブルーチンは、マッチしないかエラーが見つかった場合、0以外の値を返す。

NMatchパラメータの値が0であるか、regcompサブルーチンの呼び出しでREG_NOSUBフラグが設定されている場合、regexecサブルーチンはPMatchパラメータを無視する。 それ以外の場合、 PMatch (P) パラメーターは、 不一致 パラメーターによって指定されたエレメントの数以上の配列を指します。 regexecサブルーチンは、PMatchパラメータが指す配列の要素をStringパラメータの部分文字列のオフセットで埋めます。 オフセットは、regcompサブルーチンに指定された元のパターン・パラメーターの括弧付き部分式に対応する。

pmatch.rm_so構造体は部分文字列の先頭のバイトオフセットであり、pmatch.rm_eo構造体は部分文字列の末尾のバイトオフセットより一つ大きい値である。 副次式 I は、1 から数えて I 番目に一致する左括弧から始まります。 配列の 0 要素は、パターン全体に対応します。 Pマッチパラメーターの未使用の要素、値'Pマッチ[エヌマッチ-1]までは、'-1で埋められる。 NMatchパラメータで指定された数以上の部分式がある場合(patternパラメータ自体も部分式としてカウントされる)、最初のNMatch-1部分式のみが記録される。

基本正規表現または拡張正規表現が一致する場合、 パターン パラメーターの任意の括弧付き副次式は、 ストリング パラメーターのいくつかの異なるサブストリングと一致する可能性があります。 そうしないと、パターン全体が一致したとしても、どのサブストリングにも一致しない可能性があります。

以下の規則は、正規表現が一致したときに PMatch (P) パラメーターで報告するサブストリングを決定するために使用されます。

  • 正規表現中の部分式が複数回マッチに参加した場合、最後にマッチした部分 文字列のオフセットがPMatchパラメータに報告されます。
  • 部分式がマッチに参加しなかった場合、PMatchパラメータのバイト・オフセットは-1 の値になります。 以下のいずれかが該当する場合、副次式は一致に関与しません。
    • 基本正規表現の部分式の直後には*(アスタリスク)または˶{\}バックスラッシュ、左中括弧、バックスラッシュ、右中括弧)が現れる。
    • An *(アスタリスク), ? (クエスチョンマーク) または{ }(左右の中括弧) が拡張正規表現の部分式の直後に現れ、その部分式がマッチしなかった (0 回マッチした) 場合。
    • |(パイプ)は、マッチしなかった部分式か別の部分式を選択するために拡張正規表現で使われ、別の部分式はマッチした。
  • 部分式が部分式に含まれている場合、PMatchパラメータのデータはそのような最後の部分式を参照します。
  • 部分式が部分式に含まれ、PMatchパラメータのバイトオフセットの値が-1 の場合、PMatchパラメータのポインタの値も-1 になります。
  • 部分式が長さ0の文字列にマッチした場合、PMatchパラメータのオフセットは、マッチした文字列の直後のバイトを参照する。

REG_NOSUBフラグがregcompサブルーチンの呼び出しのcflagsパラメータに設定され、NMatchパラメータがregexecサブルーチンの呼び出しで0に等しくない場合、PMatch配列の内容は指定されない。

REG_NEWLINEフラグが、regcompサブルーチンの呼び出し時にcflagsパラメータに設定されていない場合、patternまたはStringパラメータの改行文字は通常の文字として扱われる。 regcompサブルーチンが呼ばれたときにREG_NEWLINEフラグがセットされていた場合、改行文字は以下の場合を除いて通常の文字として扱われる:

  • Stringパラメータの改行文字は、括弧式の外側のピリオドや、いかなる形式の非マッチング・リストにもマッチしない。 一致しないリスト式は ^ (曲折アクセント記号) で始まり、任意の文字または照合要素に一致するリストと、リスト内の先行キャレットの後の式を指定します。 例えば、正規表現[^abc]を除くすべての文字にマッチするa,b、またはc.サーカムフレックスがこの特別な意味を持つのは、左括弧に続くリストの最初の文字である場合だけである。
  • 式アンカーを指定するためにpatternパラメータに^(circumflex)を使用すると、REG_NOTBOLフラグの設定に関係なく、Stringパラメータの改行文字の直後にある長さ0の文字列にマッチする。
  • 式アンカーを指定するためにpatternパラメータに$(ドル記号)を使用すると、REG_NOTEOLフラグの設定に関係なく、Stringパラメータの改行文字の直前の長さ0の文字列にマッチする。

パラメーター

項目 説明
プレグ ストリング パラメーターと比較するためのコンパイル済み基本正規表現または拡張正規表現が含まれます。
STRING 突き合わせるデータが含まれます。
不一致 突き合わせる副次式の数が含まれます。
PMatch (P) プレグ パラメーター内の対応する副次式と一致する、 ストリング パラメーター内のオフセットの配列が含まれます。
E フラグ カスタマイズ可能なregexecサブルーチンの動作を制御するフラグの 0 個以上のビット単位の OR を含む。

E フラグ パラメーターは、 ストリング パラメーターの内容の解釈を変更します。 これは、regex.hファイルで定義されている以下のフラグの0個以上のビット単位の包含論理和である:

REG_NOTBOL
ストリング パラメーターが指すストリングの先頭文字が、行の先頭ではありません。 従って、^(circumflex)を特殊文字として使用した場合、Stringパラメータの先頭とは一致しない。
REG_NOTEOL
ストリング パラメーターが指すストリングの最後の文字が、行の終わりではありません。 したがって、$(ドル記号)を特殊文字として使用した場合、Stringパラメータの末尾とは一致しない。

戻り値

正常に終了すると、regexecサブルーチンは、Stringパラメータの内容がpatternパラメータの内容にマッチしたことを示す値0を返すか、マッチしなかったことを示す値0を返す。 REG_NOMATCHエラーはregex.hファイルで定義されている。

エラー・コード

regexecサブルーチンが失敗した場合、問題のタイプを示すゼロ以外の値を返す。 regex.hファイルには、返される可能性のあるエラーコードを表す以下のマクロが定義されている:

項目 説明
REG_NOMATCH 基本正規表現または拡張正規表現が一致を検出できなかったことを示します。
REG_BADPAT 無効な基本正規表現または拡張正規表現を示します。
REG_ECOLLATE 参照された照合エレメントのうち、無効なものを示します。
REG_ECTYPE 無効な文字クラス・タイプ参照を示しています。
REG_EESCAPE パターンに末尾の"◆"(バックスラッシュ)があることを示す。
REG_ESUBREG の数字を示す\digitは有効でないか、エラーである。
REG_EBRACK 左括弧と右括弧のアンバランスを示す。
REG_EPAREN (バックスラッシュ、左括弧、バックスラッシュ、右括弧)または( )(左括弧と右括弧)のバランスが悪いことを示す。
REG_EBRACE { \ }示す。(バックスラッシュ、左中括弧、バックスラッシュ、右中括弧)の不均衡を示す。
REG_BADBR { \ }内容が使えない(数字でない、数字が大きすぎる、数字が2つある、1つ目の数字が2つ目の数字より大きい)ことを示す。(バックスラッシュ、左中括弧、バックスラッシュ、右中括弧)が使用不可(数字でない、数字が大きすぎる、数字が2つ以上ある、最初の数字が2つ目より大きい)であることを示す。
REG_ERANGE 範囲式の使用できない終点を示す。
REG_ESPACE メモリー不足を示します。
REG_BADRPT を示す (クエスチョンマーク)、*(アスタリスク)、または+(プラス記号)の前に有効な基本正規表現または拡張正規表現がない場合。

regexecサブルーチンのPregパラメータの値が、regcompサブルーチンが返すコンパイル済みの基本正規表現または拡張正規表現でない場合、結果は未定義である。

次の例は、REG_NOTBOLフラグをregexecサブルーチンと併用し、ユーザーが指定したパターンにマッチする行のすべての部分文字列を検索する方法を示している。 (簡単のため、この例ではエラーチェックはほとんど行っていない)

(void) regcomp (&re, pattern, 0) ;
/* this call to regexec finds the first match on the line */
error = regexec (&re, &buffer[0], 1, &pm, 0) ;
while (error = = 0) {   /* while matches found */
<subString found between pm.r._sp and pm.rm_ep>
/* This call to regexec finds the next match */
error = regexec (&re, pm.rm_ep, 1, &pm, REG_NOTBOL) ;