tail head cat sleep
QR code linking to this page

manページ  — REGEXP

名称

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

内容

ライブラリ

Compatibility Library (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を戻します。また、 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() に従って置き換えを行ないながら、 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() のコードとマニュアルページは、トロント大学で作成され、 BSD 4.3-Tahoe に追加されました。Bell V8 regexp(3) と互換性を保つようになっていますが、Bell コードから派生したものではあ りません。

バグ

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

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

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

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


REGEXP (3) June 4, 1993

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.