日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.3-RELEASE-K, 13.0-RELEASE-K から 13.2-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
REGEX(3) FreeBSD ライブラリ関数マニュアル REGEX(3) 名称 regcomp, regexec, regerror, regfree -- 正規表現ライブラリ ライブラリ 標準 C ライブラリ (libc, -lc) 書式 #include <regex.h> int regcomp(regex_t * restrict preg, const char * restrict pattern, int cflags); int regexec(const regex_t * restrict preg, const char * restrict string, size_t nmatch, regmatch_t pmatch[restrict], int eflags); size_t regerror(int errcode, const regex_t * restrict preg, char * restrict errbuf, size_t errbuf_size); void regfree(regex_t *preg); 解説 これらのルーチンは、IEEE Std 1003.2 (``POSIX.2'') 正規表現 (``RE'') を実 装しています。re_format(7) を参照してください。regcomp() 関数は、文字列と して内部の形式に書き込まれる RE (正規表現) をコンパイルし、regexec() は、 その内部の形式を文字列と照合し、結果を報告し、regerror() は、いずれかから エラーコードを人間に読み込み可能なメッセージに変換し、そして regfree() は、RE の内部の形式によって使用されるあらゆる動的に割り付けられた記憶域を 解放します。 ヘッダ <regex.h> は、2 つの構造体のタイプ regex_t と regmatch_t を宣言し ます、前者は、コンパイルされた内部の形式のためで、後者は、照合の報告のた めのです。また、4 つの関数、タイプ regoff_t と ``REG_'' で始まる名前があ る多くの定数を宣言します。 regcomp() 関数は、cflags のフラグに従って、pattern 文字列にに含まれている 正規表現をコンパイルし、preg によって指された regex_t 構造体に結果を置き ます。cflags 引数は、次のフラグの 0 以上のビット単位の論理和 (OR) です: REG_EXTENDED デフォルトである時代遅れの (``basic'') (基本的) な RE では なく、現代的な (``extended'') (拡張) の RE をコンパイルしま す。 REG_BASIC これは、読みやすさを改善するために REG_EXTENDED に対応する ものとして提供された 0 のための同義語です。 REG_NOSPEC オフにされたすべての特別の文字を認識してコンパイルします。 したがって、すべての文字は、通常であると見なされるので、 ``RE'' は、リテラル文字列です。これは、互換性がありますが、 IEEE Std 1003.2 (``POSIX.2'') によって明記されていない拡張 で、他のシステムに移植することを目的としているソフトウェア で慎重に使用されるべきです。REG_EXTENDED と REG_NOSPEC は、 regcomp() への同じ呼び出しで使用されません。 REG_ICASE 大文字/小文字の区別を無視する照合のためにコンパイルします。 re_format(7) を参照してください。 REG_NOSUB 何と一致したかではなく、成功または失敗を報告だけを必要とす る照合のためにコンパイルします。 REG_NEWLINE 改行を区別する照合のためにコンパイルします。デフォルトで、 改行は、RE または文字列のいずれかと特別な意味がない完全に通 常の文字です。このフラグで、`[^' 角括弧の表現と `.' は、決 して改行に一致しません、`^' アンカは、その通常の関数に加え て文字列のあらゆる改行の後の空の文字列と一致し、`$' アンカ は、その通常の関数に加えて文字列のあらゆる改行の前の空の文 字列と一致します。 REG_PEND 正規表現は、最初のヌル文字ではなく、preg によって指される構 造体の re_endp メンバによって指される文字のすぐ前で終りま す。re_endp メンバは、タイプ const char * です。このフラグ は、RE にヌル文字を含むことを許可します。それらは、通常の文 字と見なされます。これは、IEEE Std 1003.2 (``POSIX.2'') と の互換性がありますが、明記されていない拡張で、他のシステム に移植することを目的としているソフトウェアで慎重に使用され るべきです。 成功するとき、regcomp() は、0 を返し、preg によって指された構造体を埋めま す。その構造体 (re_endp 以外の) の 1 つのメンバが公開されます: タイプ size_t の re_nsub は、(REG_NOSUB フラグが使用されたなら、このメンバの値が 未定義であることを除いて) RE 内の括弧に入れられた部分式の数を含んでいま す。regcomp() が失敗するなら、それは、0 以外のエラーコードを返します。 「診断」を参照してください。 regexec() 関数は、eflags のフラグに従って、preg によって指されたコンパイ ルされた RE と string を照合し、nmatch, pmatch と返された値を使用して結果 を報告します。RE は、regcomp() の前の呼び出しによってコンパイルされなけれ ばなりません。コンパイルされた形式は、regexec() の実行の間に変更されない ので、複数のスレッドによって単一のコンパイルされた RE を同時に使用するこ とができます。 デフォルトで、string によって指されたヌル文字で終了する文字列は、任意の終 了している改行を差し引いて、全体の行のテキストであると見なされます。 eflags 引数は、次のフラグの 0 個以上のビット単位の論理和 (OR) です: REG_NOTBOL 文字列の最初の文字は、行の継続して扱われます。これは、アン カ `^', `[[:<:]]' と `\<' がそれの前で一致しないことを意味 します。しかし、下記の REG_STARTEND を参照してください。こ れは、REG_NEWLINE の下の改行の振る舞いに影響しません。 REG_NOTEOL ヌル文字で終了する文字列は、行を終了しないので、`$' アンカ は、それの前に一致すべきではありません。これは、REG_NEWLINE の下の改行の振る舞いに影響しません。 REG_STARTEND 文字列は、string + pmatch[0].rm_so で始まり、nmatch の値に かかわらず、string + pmatch[0].rm_eo に位置するバイトの前で 終ると見なされます。pmatch と nmatch の定義については、下記 を参照してください。これは、互換性がありますが、IEEE Std 1003.2 (``POSIX.2'') によって明記されていない拡張で、他のシ ステムに移植することを目的としているソフトウェアで慎重に使 用されるべきです。 REG_NOTBOL なしで、位置 rm_so は、その前に `^' と一致するよ うな、行の始まりと見なされ、その前に `[[:<:]]' と `\<' と一 致するような、この位置に単語の文字があるなら、単語の始めと 見なされます。 REG_NOTBOL で、位置 rm_so の文字は、行の継続として扱われ、 rm_so が 0 より大きいなら、先導する文字は、考慮されます。先 導する文字が改行であり、正規表現が REG_NEWLINE でコンパイル されたなら、`^' は、文字列の前に一致します。先導する文字が 単語の文字ではないが、文字列が単語の文字で始まるなら、 `[[:<:]]' と `\<' は、文字列の前に一致します。 RE またはそれの部分が string のいくつかの部分文字列のいずれかと一致する状 況で一致しているものの議論については、re_format(7) を参照してください。 通常、regexec() は、成功すると 0 を返し、失敗すると 0 でないコード REG_NOMATCH を返します。他の 0 以外のエラーコードが、例外的な状況で返され るかもしれません。「診断」を参照してください。 REG_NOSUB が、RE のコンパイルで指定されたか、または、nmatch が 0 であるな ら、regexec() は、pmatch 引数を無視します (が、REG_STARTEND が指定される 場合については、下記を参照してください)。そうでなければ、pmatch は、タイ プ regmatch_t の nmatch 構造体の配列を指します。そのような構造体には、少 なくともメンバ rm_so と rm_eo、部分文字列の最初の文字のオフセット、と部分 文字列の終わりの後の最初の文字のオフセットをそれぞれ含んでいる、両方のタ イプ regoff_t (少なくとも、off_t と ssize_t と同じくらい大きな符号付き算 術タイプ) があります。オフセットは、regexec() に与えられた string 引数の 最初から測定されます。空の部分文字列は、空の部分文字列に続いている文字を 表示し、等しいオフセットによって示されます。 pmatch 配列の 0 番目のメンバは、string のどんな部分文字列が、全体の RE に よって一致したかを示すために書き込まれます。残りのメンバは、どのような部 分文字列が、RE 内の括弧で囲まれた部分表現が一致していたかを報告します。メ ンバ i は、左から右へ、RE のそれらの開き括弧の順序によって (1 で始まる) カウントされた部分表現で部分表現 i を報告します。(照合でまったく参加しな かった部分表現か、または RE に存在しない部分表現 (すなわち i > preg->re_nsub) のいずれかに対応して) 配列の未使用のエントリは、-1 に設定 された rm_so と rm_eo の両方があります。部分表現が一致に数回参加したな ら、報告された部分文字列は、一致した最後のものです。(注、特に、例として、 RE `(b*)+' が `bbb' と一致するとき、括弧に入れられた部分表現は、3 つの `b's のそれぞれと一致し、次に最後の `b' に続いている空の文字列の無限の数 と一致するので、報告された部分文字列は、空のものの 1 つです。) REG_STARTEND が指定されるなら、pmatch は、REG_STARTEND のための入力オフ セットを保持するために、(たとえ nmatch が 0 であるか、または REG_NOSUB が 指定されたとしても) すくなくとも 1 つの regmatch_t を指さなければなりませ ん。出力のための使用は、まだ nmatch によって完全に制御されます。nmatch が 0 であるか、または REG_NOSUB が指定されたなら、pmatch[0] の値は、成功した regexec() によって変更されません。 regerror() 関数は、regcomp() または regexec() のいずれかから、0 でない errcode を人間に読み込み可能なで、印刷可能なメッセージにマップします。 preg が NULL でないなら、エラーコードは、preg によって指された regex_t の 使用から起こるべきで、エラーコードが regcomp() から来るなら、その regex_t を使用して、つい最近の regcomp() からの結果となるはずです。(regerror() は、regex_t からの情報を使用して、より詳細なメッセージを供給することがで きます。) regerror() 関数は、ヌル文字で終了したメッセージを多くても errbuf_size バイトの (ヌル文字を含んだ) 長さに制限された errbuf によって 指されたバッファに置きます。全体のメッセージが適合しないなら、終端のヌル 文字が供給される前に、できるだけ多くを適合するようにします。ともかく、返 された値は、(終端のヌル文字を含んで) 全体のメッセージを保持するために必要 なバッファのサイズです。errbuf_size が 0 であるなら、errbuf は、無視され ますが、返り値は、まだ正確です。 regerror() に与えられた errcode が REG_ITOA との最初に論理和 (OR) される なら、結果は、エラーコードの印刷可能な名前である ``message'' です、例え ば、その説明ではなく、``REG_NOMATCH''。errcode が REG_ATOI であるなら、 preg は、NULL でないものとし、それが指す構造体の re_endp メンバは、エラー コードの印刷可能な名前を指さなければなりません。この場合に、errbuf の結果 は、エラーコードの数値の 10 進数です (名前が認識されないなら、0)。 REG_ITOA と REG_ATOI は、主としてデバッグ機能を目的としています。それら は、互換性がありますが、IEEE Std 1003.2 (``POSIX.2'') によって明記されて いない拡張で、他のシステムに移植することを目的としているソフトウェアで慎 重に使用されるべきです。また、それらは、実験的であると考えられ、変更が可 能なであることに注意してください。 regfree() 関数は、preg によって指されたコンパイルされた RE に関連したあら ゆる動的に割り付けられた記憶域を解放します。残りの regex_t は、もやは有効 なコンパイルされた RE ではなく、それを regexec() または regerror() に供給 している効果は、不定です。 これらの関数は、定数のテーブルを除いてグローバル変数を参照しません。すべ ては、引数が安全であるなら、複数のスレッドから使用することは安全です。 実装の選択 ``undefined'' (未定義) と明示的に記述することによって、または RE 文法に よって禁じられているそれらの長所によってのいずれかで、IEEE Std 1003.2 (``POSIX.2'') は、実装者に任せる多くの決定があります。この実装は、それら を次のように扱います。 大文字と小文字を区別しない照合の定義の議論については、re_format(7) を参照 してください。 メモリが制限される限りを除いて、RE の長さに関して特別の制限はありません。 メモリ使用量は、限界の繰り返しを除いて、RE サイズで大体リニアで、RE の複 雑さに対して大部分は無神経です。ほとんどあらゆるシステムのメモリ不足で実 行するそれらを使用する 1 つの短い RE については、「バグ」を参照してくださ い。 (そのようなマジックの意味は、時代遅れの [``basic''] (基本的な) RE でのみ 生じる) IEEE Std 1003.2 (``POSIX.2'') によってマジックの意味を特に与えら れるもの以外のバックスラッシュされた文字は、通常の文字と見なされます。 すべての一致しない `[' は、REG_EBRACK エラーです。 等価クラスは、角括弧の表現の範囲を開始するか、または終了することができま せん。1 つの範囲の終了点は、別のものを開始することができません。 限界の繰り返しの繰り返しのカウントの制限、RE_DUP_MAX は、255 です。 繰り返し演算子 (`?', `*', `+' または限界) は、別の繰り返し演算子に続ける ことはできません。繰り返し演算子は、表現または部分表現または続く `^' また は `|' を開始することはできません。 `|' は、(部分) 表現の最初と最後にまたは別の `|' の後に現れることはできま せん、すなわち、`|' のオペランドは、空の部分表現となることはできません。 空の括弧に入れられた部分表現 `()' は、正当で、空の (部分) 文字列と一致し ます。空の文字列は、正当な RE ではありません。 1 つの数字が続いている `{' は、限界のための構文に続いていなければならな い、限界のある繰り返しのための限界の最初と見なされます。1 つの数字が続か ない `{' は、通常の文字と見なされます。 時代遅れの (``basic'') (基本的) な RE の開始と終了の部分表現 `^' と `$' は、通常の文字ではなく、アンカです。 診断 regcomp() と regexec() の 0 でないエラーコードは、次の通りです: REG_NOMATCH regexec() 関数が、一致に失敗しました。 REG_BADPAT 無効の正規表現。 REG_ECOLLATE 無効の照合要素。 REG_ECTYPE 無効の文字クラス。 REG_EESCAPE `\' が、エスケープできない文字に適用されました。 REG_ESUBREG 無効のバックリファレンス番号。 REG_EBRACK 角括弧 `[ ]' が、釣り合っていませんでした。 REG_EPAREN 括弧 `( )' が、釣り合っていませんでした。 REG_EBRACE 中括弧 `{ }' が、釣り合っていませんでした。 REG_BADBR `{ }' 内の無効の反復の (複数の) カウント。 REG_ERANGE `[ ]' 内の無効の文字範囲。 REG_ESPACE メモリが不足しました。 REG_BADRPT `?', `*' または `+' オペランドが無効です。 REG_EMPTY 空の (部分) 表現。 REG_ASSERT 起こるはずがありません - 利用者は、バグを見つけました。 REG_INVARG 無効の引数、例えば、負の長さの文字列。 REG_ILLSEQ 不正なバイトシーケンス (不正なマルチバイト文字)。 関連項目 grep(1), re_format(7) IEEE Std 1003.2 (``POSIX.2''), セクション 2.8 (Regular Expression Nota tion) と B.5 (C Binding for Regular Expression Matching)。 歴史 始めに Henry Spencer によって書かれました。4.4BSD 配布に含めるために変更 されました。 バグ これは、既知の欠陥があるアルファリリースです。問題を報告してください。 バックリファレンス (back-reference) コードは、微妙で、疑いは、複雑な場合 に、その正確さがゆらぎます。 regexec() 関数の性能は、貧弱です。これは、後のリリースで改善するつもりで す。0 を越える nmatch 引数は、高価です。1 を越える nmatch は、より悪くな ります。regexec() 関数は、バックリファレンスが非常に高価であることを除い て、RE の複雑さに大部分は無関心です。RE の長さは、重要です。特に、ほとん どの特殊文字は、おおよそ 2 倍にカウントして、RE 長さを約 30 文字未満に保 持することで、かなりの速度の利点があります。 regcomp() 関数は、カウントが、大きいか、または境界のある反復が入れ子にさ れるなら、時間と空間で高価である、マクロ展開によって境界のある反復を実装 しています。`((((a{1,100}){1,100}){1,100}){1,100}){1,100}' と記述するよう な RE は、(結局) ほとんどあらゆる既存のマシンでスワップ空間の不足となりま す。 不明瞭なエラー条件への応答で疑わしい問題があります。特に、ある種類の内部 のオーバフローは、本当に巨大な RE または複数の入れ子にされた境界のある反 復によって生成され、たぶんうまく扱われません。 IEEE Std 1003.2 (``POSIX.2'') の誤りのために、`a)b' のようなものは、`)' が、一致しない `(' の前に存在するときのみ特殊文字であるので、正しい RE で す。これは、仕様が固定されるまで固定することはできません。 バックリファレンスの標準の定義は、曖昧です。例えば、`a\(\(b\)*\2\)*d' は、`abbbd' と一致しますか? 標準が明確化されるまで、そのような場合の振る 舞いは、頼りにされるべきではありません。 単語境界の照合の実装は、少しのクラッジ (kludge) があり、バグは、単語境界 の照合とアンカの組み合わせに潜んでいるかもしれません。訳注: クラッジ (kludge) は、便宜的にトリックを使って問題を一時的に解決すること。 単語境界の照合は、マルチバイトのロケールで適切に動作しません。 FreeBSD 11.2 May 25, 2016 FreeBSD 11.2