総合手引 | セクション 3 | オプション |
#include <regexp.h>
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以上の連結したピースです。最初に一致したものと一致した 後で、次に一致したものと一致します。
ピースは、`*' , `+' , `?' が続くことがあるアトムです。 `*' が続くアトムは、アトムの 0以上の一致のシーケンスと一致します。 `+' が続くアトムは、アトムの 1以上の一致のシーケンスと一致します。 `?' が続くアトムは、アトムの一致、または null ストリングと一致します。
アトムは、括弧で囲まれた正規表現(正規表現の一致と一致する)、範囲(下記 参照)、`.' ( 1キャラクタと一致する)、`^' (入力ストリングの最初の null ストリングと一致する)、`$' (入力ストリングの最後の null ストリングと一 致する)、1 キャラクタが続く `\' (そのキャラクタと一致する)、その他の 意味がない 1キャラクタ(そのキャラクタと一致する)です。
範囲は、`[]' で囲まれたキャラクタのシーケンスです。通常は、そのシーケ ンスの 1キャラクタと一致します。シーケンスが `^' で始まる場合は、シー ケンスの残りのキャラクタではない 1キャラクタと一致します。シーケンスの 2つのキャラクタが `-' で区切られている場合、これは、その 2キャラクタ に挟まれた ASCII キャラクタのリストを表します(たとえば `[0-9]' は、任意の十進数と一致し ます)。シーケンスにリテラル `]'を組み込むには、それを最初のキャラクタ にします( `^' がある場合はその次のキャラクタにします)。リテラル `-' を組み込むには、最初か最後のキャラクタにします。
一般的に、ブランチのリストの実現性は左から右に考慮されます。`*', `+', `?' の実現性は長いものから考慮されます。ネストされたコンストラクトは外 側から考慮されます。連結されたコンストラクトは左から考慮されます。 選 択される一致は、最初の選択肢の最初の実現性を使用するものとなります。 選択肢が複数ある場合は、最初の決定に従って、次が同じ方法(最初の実現性) で行なわれます。残りも同じようになります。
たとえば '(ab|a)b*c' が `abc' と一致する方法には 2つあります。最初の選択肢は、`ab' と `a' の間です。`ab' が先で、問題ない一致全体をリードするので、これが選択さ れます。`b' はすでに選択されているので、`b*' は最後の実現性(空ストリン グ)と一致します。先の選択肢を考慮する必要があるからです。
`|' が存在せず、`*' , `+', `?' が 1つだけ存在する場合は、最も長い一致 が選択される結果となります。`xabbbby' で提供された `ab*' は、`abbbb' と一致します。`ab*' が `xabyabbbz' で試されると、最初のものが選択され るので、`x' の後の `ab' と一致することに注意してください。(実際には、 一致を始める場所の決定が最初の選択肢なので、後の選択肢では、優先順位が 低い代案がリードしていてもそれを考慮する必要があります。)
NULL オペランドに `*' か `+' を適用することに課せられる制限は、システムを単 純にするためのものです。
egrep の改行で区切られたブランチはサポートされていません。V8 regexp(3) でもサポートされていません。
簡潔さと単純さを強調したため、それほど速くありません。単純なケースを 速く処理することに注意が向けられています。
REGEXP (3) | June 4, 1993 |
総合手引 | セクション 3 | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.