スポンサーリンク

REGEXP(3) FreeBSD ライブラリ関数マニュアル REGEXP(3)

名称

regcomp, regexec, regsub, regerror − 正規表現ハンドラ

ライブラリ

互換ライブラリ (libcompat, −lcompat)

書式

#include <regexp.h>

regexp *

regcomp(const char *exp);

int

regexec(const regexp *prog, const char *string);

void

regsub(const regexp *prog, const char *source, char *dest);

解説

このインタフェースは、 regex(3) で置き換えられました。

regcomp(), regexec(), regsub(), regerror() は egrep(1) スタイルの正規表現 とサポート機能を実現しています。

regcomp() は、正規表現を regexp() タイプの構造体にコンパイルし、その構造 体のポインタを戻します。スペースは malloc(3) で割り振られ、 free で解放さ れます。

regexec() 関数は、 NULL で終わる stringprog のコンパイル済み正規表現 と突き合わせます。問題がない場合は 1を戻し、問題がある場合は 0を戻しま す。また、 progstartpendp (下記参照)の内容を調整します。

regexp() 構造体のメンバには、最低でも以下が必要です。順番は関係ありませ ん。

      char *startp[NSUBEXP];
      char *endp[NSUBEXP];

NSUBEXP は、ヘッダファイルで 10に定義されています。 regexp() を使用して regexec() が問題なく実行されると、 startpendp の各ペアは、 string の サブストリングを表します。 startp はサブストリングの第 1キャラクタを指 し、 endp はサブストリングの次の第 1キャラクタを指します。0番目のサブスト リングは、正規表現全体と一致する string のサブストリングです。その他は、 正規表現の括弧で囲まれた表現と一致するサブストリングです。括弧で囲まれた 表現には、左括弧の左から右の次数で番号が付きます。

regsub() 関数は、 prog を使用して最後に実行した regexec() に従って置き換 えを行ないながら、 sourcedest にコピーします。 source の ‘&’ の各イン スタンスは、 startp[] と endp[] で示されるサブストリングで置き換えられま す。 ‘\n’ の各インスタンス(nは数字)は、 startp[n] と endp[n] で示されるサ ブストリングで置き換えられます。リテラル ‘&’ や ‘\n’ を dest に配置するに は、そのリテラルの前に ‘\’ を配置します。‘&’や ‘\n’ の前にリテラル ‘\’ を 付けるには、その前に ‘\’ をもう 1つ付けます。

regerror() 関数は、 regcomp(), regexec(), regsub() でエラーが検出されると 常に呼び出されます。デフォルトの regerror() は、原因の適切なインジケータ を使用し、ストリング msg を標準エラー出力に書き込んで exit(3) を呼び出し ます。その他のアクションが望ましい場合、ユーザは regerror() 関数を別のも のと置き換えられます。

正規表現シンタックス

正規表現は、‘|’ で区切られた、 0以上のブランチです。ブランチの 1つと一致 するものと一致します。

ブランチは、 0以上の連結したピースです。最初に一致したものと一致した後 で、次に一致したものと一致します。

ピースは、‘*’ , ‘+’ , ‘?’ が続くことがあるアトムです。 ‘*’ が続くアトム は、アトムの 0以上の一致のシーケンスと一致します。 ‘+’ が続くアトムは、ア トムの 1以上の一致のシーケンスと一致します。 ‘?’ が続くアトムは、アトムの 一致、または null ストリングと一致します。

アトムは、括弧で囲まれた正規表現(正規表現の一致と一致する)、範囲(下記参 照)、‘.’ ( 1キャラクタと一致する)、‘^’ (入力ストリングの最初の null スト リングと一致する)、‘$’ (入力ストリングの最後の null ストリングと一致す る)、1 キャラクタが続く ‘\’ (そのキャラクタと一致する)、その他の意味がな い 1キャラクタ(そのキャラクタと一致する)です。

範囲は、‘[]’ で囲まれたキャラクタのシーケンスです。通常は、そのシーケンス の 1キャラクタと一致します。シーケンスが ‘^’ で始まる場合は、シーケンスの 残りのキャラクタではない 1キャラクタと一致します。シーケンスの 2つのキャ ラクタが ‘−’ で区切られている場合、これは、その 2キャラクタに挟まれた ASCII キャラクタのリストを表します(たとえば ‘[0-9]’ は、任意の十進数と一 致します)。シーケンスにリテラル ‘]’を組み込むには、それを最初のキャラクタ にします( ‘^’ がある場合はその次のキャラクタにします)。リテラル ‘−’ を組 み込むには、最初か最後のキャラクタにします。

あいまい性

正規表現が入力ストリングの 2つの部分と一致する場合は、最初のものと一致し ます。両方が同じ場所で始まっているが長さが異なる場合、または長さが同じで 別々の場所で始まっている場合、現実は以下のように複雑になります。

一般的に、ブランチのリストの実現性は左から右に考慮されます。‘*’, ‘+’, ‘?’ の実現性は長いものから考慮されます。ネストされたコンストラクトは外側から 考慮されます。連結されたコンストラクトは左から考慮されます。 選択される一 致は、最初の選択肢の最初の実現性を使用するものとなります。選択肢が複数あ る場合は、最初の決定に従って、次が同じ方法(最初の実現性) で行なわれます。 残りも同じようになります。

たとえば ‘(ab|a)b*c’ が ‘abc’ と一致する方法には 2つあります。最初の選択 肢は、‘ab’ と ‘a’ の間です。‘ab’ が先で、問題ない一致全体をリードするの で、これが選択されます。‘b’ はすでに選択されているので、‘b*’ は最後の実現 性(空ストリング)と一致します。先の選択肢を考慮する必要があるからです。

‘|’ が存在せず、‘*’ , ‘+’, ‘?’ が 1つだけ存在する場合は、最も長い一致が選 択される結果となります。‘xabbbby’ で提供された ‘ab*’ は、‘abbbb’ と一致し ます。‘ab*’ が ‘xabyabbbz’ で試されると、最初のものが選択されるので、‘x’ の後の ‘ab’ と一致することに注意してください。(実際には、一致を始める場所 の決定が最初の選択肢なので、後の選択肢では、優先順位が低い代案がリードし ていてもそれを考慮する必要があります。)

戻り値

regcomp() 関数は、シンタックスエラー、システム制限の超越、 NULL オペラン ドへの ‘+’ や ‘*’ の適用などのエラーが発生した場合は NULL を戻します( regerror() が開始されます)。

関連項目

ed(1), egrep(1), ex(1), expr(1), fgrep(1), grep(1), regex(3)

歴史

regcomp(), regexec(), regsub(), regerror() のコードとマニュアルページは、 トロント大学で作成され、 4.3-TahoeBSD に追加されました。Bell V8 regexp(3) と互換性を保つようになっていますが、Bell コードから派生したものではありま せん。

バグ

空のブランチと空の正規表現は、V8 と互換性はありません。

NULL オペランドに ‘*’ か ‘+’ を適用することに課せられる制限は、システムを 単純にするためのものです。

egrep の改行で区切られたブランチはサポートされていません。V8 regexp(3) で もサポートされていません。

簡潔さと単純さを強調したため、それほど速くありません。単純なケースを速く 処理することに注意が向けられています。

FreeBSD 10.0 June 4, 1993 FreeBSD 10.0

スポンサーリンク