名前 | 形式 | 機能説明 | 使用例 | 戻り値 | エラー | 属性 | 関連項目 | 注意事項
#include <regexpr.h>char *compile(char *instring, char *expbuf, const char *endbuf);
extern char *loc1, loc2, locs;
extern int nbra, regerrno, reglength;
extern char *braslist[], *braelist[];
これらのルーチンは、正規表現をコンパイルして、コンパイルした表現を行と一致する場合に使用します。コンパイルされた正規表現は、ed(1) によって使用される形式になります。
instring パラメータは、正規表現を表す NULL で終了する文字列です。
expbuf パラメータは、コンパイルされた正規表現が格納される場所を指しています。expbuf が NULL であれば、compile() は malloc(3C) を使用してコンパイルした正規表現にメモリー空間を割り当てます。エラーが発生すると、このメモリー空間は解放されます。コンパイルした正規表現が必要なくなったときに不要なメモリー空間を解放するのは、ユーザーの役割となります。
endbuf パラメータはコンパイルされた正規表現が格納される最高位アドレスより 1 つ上のアドレスです。この引数は expbuf が NULL であると無視されます。コンパイルした表現が (endbuf–expbuf) バイトに収まらない場合は、compile() は NULL を返し、regerrno (以下を参照) は 50 に設定されます。
string パラメータは、一致について検査が行われる文字列へのポインタです。この文字列は NULL で終わる必要があります。
expbuf パラメータは、compile() 関数を呼び出して得られるコンパイルした正規表現です。
step() 関数は、指定した文字列が正規表現と一致していると 0 以外を返し、一致していないと 0 を返します。一致していると、step() を呼び出す際の副作用として 2 つの外部文字ポインタが設定されます。step() の変数セットは loc1 と loc2 です。loc1 は、正規表現と一致した最初の文字へのポインタです。変数 loc2 は、正規表現に一致する最後の文字の後に来る文字を指しています。したがって、正規表現が行全体と一致していると、loc1 は string の最初の文字を指し、loc2 は string の最後の NULL を指しています。
step() の目的は、一致を見つけるか、string が最後になるまで、string 引数を読みながら処理することです。正規表現が ‸ から始まっている場合、step() は文字列の先頭でだけ正規表現を一致させようとします。
advance() 関数は step() と同様ですが、advance() は loc2 だけを設定し、つねに文字列の先頭で正規表現を一致させます。
あるユーザーが同一の文字列内で連続する一致を検索している場合には、locs は loc2 と同じに設定し、step() は loc2 と同じ string を用いて呼び出す必要があります。s/y*//g のようなグローバル置換が永久にループしないように、またデフォルトでは NULL になるように、locs は ed コマンドおよび sed のようなコマンドで使用されます。
nbra 外部変数は、コンパイルされた正規表現における副表現数を決定する場合に使用します。braslist および braelist は、一致した文字列内の nbra 副表現の先頭と終わりを指している文字列ポインタの配列です。たとえば、文字列 sabcdefg および正規表現 \(abcdef\) を用いて step() または advance() を呼び出すと、braslist[0] は a を指し、braelist[0] は g を指しています。これらの配列は、副表現の \n 表記法を含む代替置換パターンについて ed および sed のようなコマンドで使用されます。
文字列が正規表現と一致するかどうかだけ検査している場合は、regerrno、nbra、loc1、loc2、locs、braelist、および braslist の各外部変数を使用する必要はないことに注意してください。
#include <regexpr.h> . . . if(compile(*argv, (char *)0, (char *)0) == (char *)0) regerr(regerrno); . . . if (step(linebuf, expbuf)) succeed( );
compile() は、成功すると、その値が expbuf で異なる非 NULL ポインタを返します。expbuf が非 NULL の場合は、compile() はコンパイルした正規表現の最終バイトの後のバイトへのポインタを返します。コンパイルした正規表現の長さは reglength に格納されます。それ以外の場合は、compile() は malloc によって割り当てられたメモリー空間へのポインタを返します。
step() 関数および advance() 関数は、指定した文字列が正規表現に一致する場合には 0 以外を返し、一致しない場合には 0 を返します。
正規表現のコンパイル中にエラーが検出されると、compile() から NULL ポインタが返され、regerrno は以下に示した 0 でないエラー番号の 1 つに設定されます。
エラー | 説明 |
---|---|
11 | 範囲が広すぎます。 |
16 | 番号が間違っています。 |
25 | "\digit" が範囲外です。 |
36 | 区切り文字が指定されていないか、間違っています。 |
41 | 検索文字列が記憶されていません。 |
42 | \( と \) が合っていません。 |
43 | \( が多すぎます。 |
44 | \{ と \} に 3 つ以上の数が指定されています。 |
45 | \ の後に } がありません。 |
46 | \{ と \} において最初の数字が 2 番目の数を超えています。 |
49 | [ と ] が合っていません。 |
50 | 正規表現がオーバフローしました。 |
次の属性については attributes(5) のマニュアルページを参照してください。
属性タイプ | 属性値 |
---|---|
MT レベル | MT-Safe |
マルチスレッドアプリケーションを コンパイルする際に、_REENTRANT フラグはコンパイル行に定義しなければなりません。このフラグはマルチスレッドアプリケーションの際にのみ使います。