compile() - 正規表現のコンパイル

標準

標準/拡張機能 C/C++ 依存項目

XPG4
XPG4.2

両方  

形式

#define INIT declarations
#define GETC() getc_code
#define PEEK() peek_code
#define UNGETC() ungetc_code
#define RETURN(ptr) return_code
#define ERROR(val) error_code

#define _XOPEN_SOURCE
#include <regexp.h>

char *compile(char *instring, char *expbuf, const char *endbuf, int eof);

機能説明

制約事項: この関数は、AMODE 64 ではサポートされません。

compile() 関数は、入力として単純な正規表現を 受け取り、step() および advance() 関数で使用できるコンパイル済み表現 を作成します。

最初のパラメーターの instring が、compile() で 明示的に使用されることはありません。これは、ソースの正規表現を定義する文字ストリングを 指すポインターです。入力文字を指す別のポインターを渡すことは、プログラム にとって役に立ちます。外部配列に文字を入力したり、外部配列に文字を置く 関数を呼び出すプログラムは、このパラメーター に (char *)0 を渡すことができます。

expbuf は、コンパイル済み正規表現が配置される 位置を指すポインターです。

endbuf は、コンパイル済み正規表現を配置することが できる最上位アドレスよりも上位のアドレスを指します。コンパイル済み表現が (endbuf-expbuf) バイトに 収まらない場合、ERROR(50) の呼び出しが行われます(以下の"戻り値"を参照してください)。

eof は、正規表現の終了を示す文字です。

compile() 関数の z/OS®UNIX サービスのインプリメンテーション は、国際化されている単純式を入力として受け入れません。国際化されている単純式 (例えば、[[=c=]] (等価クラス)) は、予測できない結果をもたらすことがあります。

プログラムでは、#include <regexp.h> ステートメントの前に、以下の 5 つのマクロが宣言されていることが必要です。GETC()、PEEKC()、および UNGETC() マクロは、compile() への 入力として指定される正規表現で動作します。
GETC()
このマクロは、正規表現パターンの次の文字 (バイト) の 値を戻します。引き続いて GETC() の呼び出しを行うと、正規表現の続きの文字を 戻します。
PEEK()
このマクロは、正規表現パターンの次の文字 (バイト) を 戻します。引き続いて即時に PEEK() を呼び出すと、同じバイトを戻しますが、このバイトは GETC() が戻す 次の文字でもあるはずです。
UNGETC(c)
このマクロにより、c 引数は GETC() の 次の呼び出しによって戻されます。必要となるのは 1 文字のみであり、この文字が GETC() に よって読み取られる最後の文字になることが保証されます。UNGETC() マクロの値は常に無視されます。
RETURN(ptr)
このマクロは、compile() 関数の通常出口で使用されます。ptr 引数の値は、コンパイル済み正規表現の最終文字の 次の文字を指すポインターです。
ERROR(val)
このマクロは、compile() からの異常終了の戻りです。val 引数はエラー番号です (詳細は、以下の"戻り値"を参照してください)。この呼び出しが戻ることはありません。
注 :
  1. z/OSUNIX サービスは、上記のユーザー・マクロが提供されて いない場合、デフォルト・マクロを提供しません。
  2. <regexp.h> をインクルードする各プログラム には、INIT 用の #define ステートメント がなければなりません。このステートメントは、依存宣言および初期化に使用します。例えば、このステートメントを使って、正規表現の開始を指す変数を設定することができます。この結果、GETC()、PEEK()、および UNGETC() 用の宣言で この変数を使うことができます。
  3. 外部変数の cirfsed、および nbra は予約済みです。
  4. compile()、step()、および advance() 関数が マルチスレッド環境で稼働中の場合、アプリケーションは これらの関数のシリアライズを適切に行わなければなりません。

単純正規表現

単純正規表現 (SRE) は、一組のストリングを指定します。正規表現の最も単純な形式は、特別な意味をもたない文字ストリングです。メタキャラクターとして知られている特殊文字の小さなセット は、パターンで検出されたときに特殊な意味を持ちます。
意味
c
c が特殊文字ではない、文字の c
¥c
c が任意の特殊文字である、文字の c。例えば、a¥.ea.e と同等です。
^
比較されているストリングの先頭。
$
ドル記号は、ストリングの終わりと一致します
.
ピリオド記号は任意の 1 文字と一致します。
[string]
大括弧内のストリングは、string 内の任意の文字を指定しま す。したがって、その他のストリングと比較した場合に、[abc] は a、b、または c を含むどのようなストリングとも一致することになります。

] (右大括弧) は、開いた左大括弧 または [^ の直後に置かれる場合に限って、対の大括弧の中で単独で使用することができます。

範囲は、c-c として指定できます。大括弧内のハイフン記号は、「範囲」という意味です。この記号は、照合シーケンスに応じて間に入っている文字を 充てんします。例えば、[a-z] は [abc…xyz] と 等価です。 照合シーケンスの中で、範囲の終了文字が開始文字よりも低い場合、開始範囲と終了範囲の文字だけが検索パターンで 受け入れられます。例えば、[9-1] は [91] と等価です。LC_COLLATE カテゴリーが C ロケールに設定されている場合 に限り、単純正規表現の範囲が有効なことに注意して ください。

- (ハイフン) は単独で使用できますが、使用できるのは、これが式の先頭文字または最終文字である 場合だけです。例えば、[]a-f] という 式は、] または a から f までの 文字の 1 つのいずれかと一致します。

[^ストリング]
脱字記号は、大括弧の内側にあるときは、大括弧内の文字を否定します。したがって、その他のストリングと比較した場合に、[^abc] は a、b、または c の いずれか 1 つでも含むストリングとは一致しないことになります。
注: .、*、[、および ¥ (それぞれ、ピリオド、アスタリスク、左大括弧、バックスラッシュ) の文字には 特殊な意味があります。ただし、これらの文字が 大括弧 ([]) 内にある場合や、これらの文字の前の 文字が ¥ であるときは除きます。
*
アスタリスク記号は、0 個以上の先行文字を示します。例えば、(a*e) は、e、ae、aae、aaae などのどれとも一致します。左端が最も長く一致するものが選択されます。
rx
正規表現 r のオカレンスの後に 正規表現 x のオカレンスが続きます。
¥{m¥} ¥{m,¥} ¥{m,u¥}
¥{¥} に囲まれている整数値は、前の正規表現を適用する回数を示しています。m は最小数で、u は最大数です。u は 256 未満でなければなりません。 m だけを指定すると、正規表現を適用する正確な回数を示します。

¥{m,¥} は ¥{m,255¥} と等価です。 これらは両方とも、式の m 個以上のオカレンスと一致します。* (アスタリスク) 演算子は、¥{0,¥} と同等です。

オカレンスの最大数は一致します。

¥(r¥)
正規表現 r。¥( と ¥) のシーケンスは無視されます。
¥n
¥n (この場合、1 <= n <= 9) が 連結された正規表現の中に現れる場合、これは、正規表現 x を 表します。この x は、連結された正規表現の中に以前に 現れた ¥( と ¥) のシーケンスで囲まれた n 番目の 正規表現です。例えば、¥(c¥)onc¥(ate¥)n¥2 パターン では、¥2 は ate と等価で、この式は concatenate を示します。

式の先頭の ^ 文字は、改行の直後、または 突き合わせの適用先の各ストリングの先頭でのみ正常な突き合わせを許可します。式の最後の文字 $ には末尾の改行が必 要です。

注 :
  1. compile() 関数は、regexp.h ヘッダーに物理的 に組み込まれます。このヘッダーは、ほかの c ヘッダーのように、複数の起動から 保護されます。
  2. compile()、step()、および advance() 関数は、古いアプリケーションに対応するために用意されているものです。 これらの関数は Single UNIX Specification、バージョン 2 のレガシー機能の 一部でした。既に廃止され、Single UNIX Specification、バージョン 3 の一部として サポートされていません。新しいアプリケーションでは、より新しい関数の fnmatch()、glob()、regcomp()、および regexec() を使用してください。 これらの関数は、IEEE 標準 1003.1-2001 と 互換性を持つ完全な国際化正規表現の機能を提供します。

戻り値

正常終了の場合、compile() は、ユーザー提供 の RETURN(ptr) マクロを使用して終了します。ptr 引数の値は、コンパイル済み正規表現の最終文字の 次の文字を指すポインターです。

正常終了しなかった場合は、compile() は、ユーザー提供 の ERROR(val) マクロを使用して終了します。val 引数はエラーを示すエラー番号です。以下のエラー番号が定義されています。
エラー・コード
ストリングの説明
11
範囲のエンドポイントが大きすぎる
16
番号が間違っている
25
¥ が範囲外である
36
区切り文字が無許可または欠落している
41
記憶された検索ストリングがない
42
¥( ¥) が対になっていません
43
¥( が多すぎる
44
¥{ ¥} に 2 つを超える数字が指定されている
45
¥ の後に } が期待される
46
¥{ ¥} の最初の数字が 2 番目の数字を超えている
49
[ ] が対になっていません
50
正規表現がオーバーフローしている

関連情報