バナーをクリックすれば目次に戻ります

Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.


RWCRegexp

形式

#include <rw/regexp.h>
RWCRegexp re(".*\\.doc");// 接尾辞 ".doc" を持つファイル名と一致する

説明

このクラスは正規表現を表します。コンストラクタは、正規表現を効率良く使用できる形式にコンパイルします。クラス RWCString を使用して、その結果を文字列検索に使用します。

正規表現 (RE) は次の規則にもとづいて作成されます。

1 文字 RE は、次の規則によって単一文字と一致します。

1.1 特殊文字として定義されていない文字はすべて、それ自身と一致します。

1.2 バックスラッシュ (\) の後ろに特殊文字が続くと、そのリテラル文字自身と一致します (つまり、特殊文字をエスケープします)。

1.3 特殊文字とは、次のものを指します。

          +     *     ?     .     [     ]     ^     $
1.4 ピリオド (.) は、復帰改行を除くすべての文字と一致します。たとえば、".umpty" は "Humpty" や "Dumpty" と一致します。

1.5 角括弧 ([ ]) に囲まれた文字セットは、その文字セット内の任意の文字と一致する 1 文字 RE を表します。たとえば "[akm]" は、"a" や "k"、または "m" を表します。文字の範囲は、ダッシュで示します。たとえば "[a-z]" は、小文字の英字すべてを表します。ただし、文字セットの最初の文字が山型記号 (^)ならば、RE は文字セット内の文字以外の文字を表します。空の文字列は表しません。たとえば "[^akm]" は、"a"、"k"、および "m" 以外の文字を示します。山型記号は、文字セット内の最初の文字でなければ、このような特殊な意味は持ちません。

複数文字 RE は、次の規則にもとづいて構築されます。

2.1 1 文字 RE の後ろにアスタリスク (*) が続くと、その RE がゼロ個以上続いたものに一致します。たとえば "[a-z]*" は、ゼロ個以上の小文字の英字と一致します。

2.2 1 文字 RE の後にプラス記号 (+) が続くと、その RE が 1 個以上続いたものに一致します。たとえば "[a-z]+" は、1 個以上の小文字の英字と一致します。

2.3 疑問符 (?) はオプションの要素で、それに先行する RE をゼロ個か 1 個、文字列の中に発生させます。たとえば "xy?z" は、"xyz" か "xz" と一致します。

2.4 RE を連結すると、連結した文字列に一致します。たとえば "[A-Z][a-z]*" は、大文字で始まる語と一致します。

さらに、記された正規表現全体を、行の始めか終わりだけに限定することもできます。

3.1 山型記号 (^) が RE の最初にあれば、文字列は行の始めで一致しなければなりません。

3.2 ドル記号 ($) が RE の最後にあれば、文字列は行の終わりで一致しなければなりません。

次のように、エスケープコードを使用して制御文字と一致させることができます。

\b バックスペース
\e ESC (エスケープ)
\f フォームフィード
\n 復帰改行
\r キャリッジリターン
\t タブ
\xddd リテラル 16 進数 0xddd
\ddd リテラル 8 進数 0ddd
\^c 制御コード (たとえば \^D は "control-D")

持続性

なし

#include <rw/regexp.h>
#include <rw/cstring.h>
#include <rw/rstream.h>

main() {
  RWCString aString("Hark! Hark! the lark");

  // "l" で始まる任意の小文字単語と一致する正規表現
  RWCRegexp reg("l[a-z]*");

  cout << aString(reg) << endl; // "lark" を出力
}

公開コンストラクタ

RWCRegexp(const char* pat);

pat で与えられるパターンから正規表現を作成します。結果の状態は、メンバー関数 status() を使用して得られます。

RWCRegexp(const RWCRegexp& r);

コピーコンストラクタ。値の意味を使用して、自分自身に r をコピーします。

公開デストラクタ

~RWCRegexp();

デストラクタ。割り当てられているメモリーを解放します。

代入演算子

RWCRegexp&
operator=(const RWCRegexp&);

値の意味を使用して、自分自身に r をコピーします。

RWCRegexp&
operator=(const char* pat);

pat が与えるパターンに自分自身を再構成します。結果の状態は、メンバー関数 status() を使用して得られます。

公開メンバー関数

size_t
index(const RWCString& str,size_t* len, size_t start=0) const;

文字列 str の中で、自分自身内でコンパイルされた正規表現と一致する最初のインスタンスのインデックスを返します。一致するインスタンスがなければ RW_NPOS を返します。検索は、インデックス start から始まります。一致したパターンの長さは len が指す変数に返されます。検索に使用された正規表現が無効であれば、RWInternalErr 型の例外が発生します。このメンバー関数は使いにくい関数です。正規表現検索のインタフェースとしてはクラス RWCString の方が優れています。

statVal
status();

正規表現の状態を返し、状態を OK にリセットします。

statVal 意味
RWCRegexp::OK エラーなし
RWCRegexp::ILLEGAL パターンが不当
RWCRegexp::TOOLONG パターンが最大長を超えた1
1 パターンに割り当てた領域を変更するには、ファイル regexp.cpp を編集して RWCRegexp::maxval_ の値を変更します。それから、変更したオブジェクトを再コンパイルし、適切なライブラリに挿入します。