1

APR 1.2.2 は正規表現をサポートしていますか? それを使用するためのドキュメントやチュートリアルはありますか?

ドキュメンテーションは最悪です。本当に悪いように。

4

2 に答える 2

4

以下は、Perl と C を使用した Apache モジュールの記述という本からの抜粋です。

regex_t *ap_pregcomp (pool *p, const char *pattern, int cflags);
    void ap_pregfree (pool *p, regex_t *reg);

Apache は、システム ライブラリの正規表現ルーチン regcomp()、regexec()、regerror()、および regfree() を使用した正規表現マッチングをサポートしています。これらの関数が利用できない場合、Apache は正規表現ルーチンの独自のパッケージを使用します。正規表現ルーチンのドキュメントは、システムのマニュアル ページにあります。システムがこれらのルーチンをサポートしていない場合、Apache の正規表現パッケージのドキュメントは、Apache ソース ツリーの regex/ サブディレクトリにあります。

正規表現の一致は 2 つのフェーズで発生します。最初のフェーズでは、regcomp() を呼び出して、正規表現パターン文字列をコンパイル済みの形式にコンパイルします。2 番目のフェーズでは、コンパイルされたパターンを regexec() に渡して、検索パターンをソース文字列と照合します。regexec() は、正規表現の一致を実行する過程で、一致した括弧で囲まれた各部分式のオフセットを pmatch[] という名前の配列に書き込みます。この配列の重要性は、すぐに明らかになるでしょう。

Apache は、regcomp() と regfree() の周りにラッパー ルーチンを提供し、正規表現の操作をいくらか簡単にします。ap_pregcomp() は、regcomp() と同様に機能して正規表現文字列をコンパイルしますが、提供されたリソース プール ポインターからコンパイルされた式にメモリを自動的に割り当てる点が異なります。pattern にはコンパイルする文字列が含まれ、cflags は実行する正規表現のタイプを制御するフラグのビット マスクです。フラグの完全なリストは、regcomp() マニュアル ページにあります。

正規表現の割り当てに加えて、ap_pregcomp() は、regfree() を呼び出すクリーンアップ ハンドラを自動的にインストールして、トランザクションの終了時にコンパイルされた正規表現によって使用されるメモリを解放します。

そういえば、ap_pregcomp() によってインストールされるクリーンアップ ハンドラは ap_pregfree() です。regfree() を呼び出して正規表現を解放し、クリーンアップ ハンドラー リストから自身を削除して、2 回呼び出されないようにします。ありそうもない理由で、クリーンアップが正常に実行される前に、正規表現によって使用されるメモリを解放する必要がある場合は、自分で ap_pregfree() を呼び出すことができます。

char *ap_pregsub (pool *p, const char *input, const char *source, size_t nmatch,
regmatch_t pmatch[ ])

regexec() で正規表現の一致を実行した後、ap_pregsub() を使用して、操作中に一致した部分式に基づいて一連の文字列置換を実行できます。この関数は pmatch[] 配列を使用します。regexec() は、正規表現によって一致したすべての括弧で囲まれた部分式の開始位置と終了位置を取り込みます。ap_pregsub() に、p、リソース プール ポインター、入力、実行する置換を説明する文字列、source、正規表現一致に使用されるソース文字列、nmatch、pmatch 配列のサイズ、および pmatch 自体を指定します。input は、式 $1 から $9 を含む任意の文字列です。ap_pregsub() は、これらの式をソース文字列からの対応する一致した部分式に置き換えます。$0 も使用できます。一致した文字列全体に対応します。戻り値は、置換された入力文字列から形成された、新しく割り当てられた文字列になります。

次の例は、ap_pregsub() を使用して、.htm および .HTM ファイル拡張子を .html に置き換えることを示しています。まず、ap_pregcomp() を呼び出して目的の正規表現をコンパイルし、コンパイルされたパターンをリソース プールから割り当てられたメモリに返します。一致で大文字と小文字を区別せず、最新の正規表現構文を使用するフラグを指定します。pmatch[] 配列を初期化して、2 つの regmatch_t 要素を保持します。2 つの要素が必要です。1 つ目は $0 に対応し、2 つ目はパターン内の単一の括弧で囲まれた部分式に対応します。次に、コンパイルされたパターン、要求されたファイル名、pmatch[] 配列、およびその長さを指定して regexec() を呼び出します。さまざまな追加オプション フラグを渡すために使用される regexec() の最後の引数は、ゼロに設定されます。regexec() がゼロを返す場合、

ap_regmatch_t pmatch[2];
ap_regex_t *cpat = ap_pregcomp(r->pool, "(.+)\\.htm$",
    AP_REG_EXTENDED|AP_REG_ICASE);
if (ap_regexec(cpat, r->filename, cpat->re_nsub+1, pmatch, 0) == 0)
{
  r->filename = ap_pregsub(r->pool, "$1.html",
      r->filename, cpat->re_nsub+1,
      pmatch);
}
于 2010-10-24T14:40:58.770 に答える
0

私は同意します、ドキュメントはひどいです。

ここを見て:

http://apr.apache.org/docs/apr-util/1.2/files.html

いいえ、1.2.2には正規表現はありません。

于 2010-06-08T17:28:19.130 に答える