Tools.h++ 7.0 クラスライブラリ・リファレンスマニュアル: RWCRExpr

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

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

## RWCRExpr

### 形式

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

### 説明

  クラス RWCRExpr は、`lex` や `awk` で使用される拡張正規表現を表します。コンストラクタは、正規表現を効率良く使用できる形式に「コンパイル」します。クラス RWCString を使用して、その結果を文字列検索に使用できます。正規表現のサイズは任意であり、メモリー容量によって制限されます。ここで使用する拡張正規表現機能は、POSIX.2 規格（ANSI/IEEE Std 1003.2、ISO/IEC 9945-2）のサブセットです。

  > 注 - RWCRExpr はコンパイラが例外処理と C++ 標準ライブラリをサポートしている場合にのみ使用できます。

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

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

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

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

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

     `+ * ? . [ ] ^ $ ( ) { } | \`

  3. ピリオド (.) はすべての文字に一致します。たとえば、「.umpty」は「Humpty」や「Dumpty」に一致します。

  4. 角括弧 ([ ]) に囲まれた文字セットは、その文字セット内の任意の文字に一致する 1 文字 RE です。たとえば「[akm]」は、「a」、「k」、「m」のどれかに一致します。文字の範囲は、ダッシュで示します。たとえば「[a-z]」は、小文字の英字すべてに一致します。ただし、文字セットの最初の文字がキャレット (^) である場合、RE は文字セット内の文字以外の文字に一致します。空の文字列には一致しません。たとえば、[^akm] は、「a」、「k」、「m」以外の文字に一致します。キャレットは、文字セット内の最初の文字でなければ、このような特殊な意味は持ちません。複数文字 RE は、次の規則にもとづいて構築されます。

  5. 括弧 (( )) は正規表現の部分を複式にまとめ、1 つの単位として扱うことができます。たとえば、(ha)+ は 1 つ以上の「ha」に一致します。

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

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

  8. 疑問符 (?) はオプションの要素を表します。疑問符に先行する RE は、ゼロ個か 1 個、文字列の中に発生する可能性があります。たとえば「xy?z」は、「xyz」か「xz」に一致します。

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

  10. OR 文字 ( | ) は、2 つの正規表現のどちらかを選択できます。たとえば、jell(y|ies) は「jelly」か「jellies」に一致します。

  11. 中括弧 ({ }) は将来使用するために予約されています。

  12. 正規表現の全部または一部は、検索する文字列の先頭または末尾に「固定」することができます：

  13. キャレット (^) が (副) 式の最初にあれば、文字列は検索対象文字列の始めで一致しなければなりません。

  14. ドル記号 ($) が (副) 式の最後にあれば、文字列は検索対象文字列の終わりで一致しなければなりません。

### 持続性

  なし

### 例

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

      main(){
        RWCString aString("Hark! Hark! the lark");
        // 「l」で始まる任意の小文字単語または単語の末尾の文字列に一致する正規表現
        //
      RWCRExpr re("1[a-z]*");

        cout << aString(re) << endl;  // 「lark」を出力する
      }

### 公開コンストラクタ

      RWCRExpr(const char* pat);
      RWCRExpr(const RWCString& pat);

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

      RWCRExpr(const RWCRExpr& r);

    コンストラクタをコピーします。値の意味論を使用して、自分自身が `r` のコピーになるようにします。

      RWCRExpr();

    デフォルトコンストラクタ。正規表現はパターンを割り当ててから使用します。

### 公開デストラクタ

      ~RWCRExpr();

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

### 代入演算子

      RWCRExpr&
      operator=(const RWCRExpr& r);

    パターン `r` に自分自身を再コンパイルします。

      RWCRExpr&
      operator=(const char* pat);
      RWCRExpr&
      operator=(const RWCString& pat);

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

### 公開メンバー関数

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

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

      statusType
      status() const;

    正規表現の状態を返します。

    statusType | 意味
    --- | ---
    `RWCRExpr::OK` | エラーなし
    `RWCRExpr::NOT_SUPPORTED` | POSIX.2 機能はサポートされていない
    `RWCRExpr::NO_MATCH` | 一致を見つけようとしたが失敗した
    `RWCRExpr::BAD_PATTERN` | パターンが不当
    `RWCRExpr::BAD_COLLATING_ELEMENT` | 無効な照合要素を参照した
    `RWCRExpr::BAD_CHAR_CLASS_TYPE` | 無効な文字クラスタイプを参照した
    `RWCRExpr::TRAILING_BACKSLASH` | パターンの最後に \ がある
    `RWCRExpr::UNMATCHED_BRACKET` | 「[」と「]」が対応していない
    `RWCRExpr::UNMATCHED_PARENTHESIS` | 「(」と「)」が対応していない
    `RWCRExpr::UNMATCHED_BRACE` | 「{」と「}」が対応していない
    `RWCRExpr::BAD_BRACE` | {} の内容が無効
    `RWCRExpr::BAD_CHAR_RANGE` | [a-z] 式の終端が無効
    `RWCRExpr::OUT_OF_MEMORY` | メモリー不足
    `RWCRExpr::BAD_REPEAT` | ?、*、+ の前の正規表現が無効