REGEXP(3)

名称
regcomp, regexec, regsub, regerror - 正規表現ハンドラ

ライブラリ
libcompat

書式
<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 で終わる string を prog のコンパイル済み正規表現と突き合わせます。問題がない場合は 1を戻し、問 題がある場合は 0を戻します。また、 prog の startp と endp (下記参照)の内容を調整します。

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

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

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

regsub() 関数は、 prog を使用して最後に実行した regexec() に従って置き換えを行ないながら、 source を dest にコピーします。 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) でもサポートされていません。

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