株式会社エス・スリー・フォー

3.1 基本的な例

次の例は、文字列クラスの重要な機能を示したものです。この例では、RWCString を使ってある文書の古いバージョン番号を新しいバージョン番号で置き換えてみました。

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

main(){
  RWCString a;                     //1 文字列オブジェクト a を作成する

  RWCRegexp re("V[0-9]\\.[0-9]+"); //2 正規表現を定義する
  while( a.readLine(cin) ){        //3 標準入力を a に読み取る
    a(re) = "V4.0";                //4 一致したものを置き換える
    cout << a << endl;
  }
  return 0;
}

入力:

This text describes V1.2.  For more
information see the file install.doc.
The current version V1.2 implements...

出力:

This text describes V4.0.  For more
information see the file install.doc.
The current version V4.0 implements...

このコードは、クラスの動作を示したものです。RWCString が文字列オブジェクト a を生成し、標準入力から文字列を a に読み取り、定義されている正規表現”V[0-9]\\.[0-9]+”.と一致するパターンを a の中で検索します。V0 から V9 までのバージョン番号は、一致したとみなされます。例えば、V1.2 と V1.22 は一致ですが、V12.3 は一致ではありません。一致した文字列は、文字列「V4.0」に置き換えられます。

この演算の強力な点は、次の式にあります。

a(re) = "V4.0";

() は、多重定義された演算子の例です。多重定義された演算子は、状況や引数に応じて複数の機能を実行することができます。

この例では、関数呼び出し演算子 RWCString::operator() は、型 RWCRegexp (正規表現) の引数を持つように多重定義されています。演算子は、正規表現と一致する部分文字列、または一致する表現が見つからない場合はヌルの部分文字列を返します。次に、プログラムは部分文字列代入演算子を呼び出して、範囲内の文字を右側の内容で置き換えるか、これがヌルの部分文字列の場合には何も行いません。Tools.h++ は演算子を多重定義しているため、定義された正規表現による一括検索および置換を、1 行のコ-ドで行うことができます。

お気づきのように、特殊文字「.」が文字どおり小数点として解釈されるためには、「V[0-9]\\.[0-9]+」にバックスラッシュ (日本語システムでは \ になる) が 2 個必要です。これは、コンパイラがリテラル文字列を評価する時に、バックスラッシュを 1 個削除するためです。もう 1 つのバックスラッシュが正規表現の評価時に、次につづく文字が何であっても文字どおりに読み取るように指示します。

次の例では、RWCString が別の多重定義された演算子 + を用いて、文字列 s1 と s2 を連接します。メンバ関数 toUpper は小文字を大文字に変換し、その結果を cout に送ります。

RWCString s1, s2;
cin >> s1 >> s2;
cout << toUpper(s1+s2);

文字列クラスについて詳しくは、『Tools.h++ Class Reference』を参照してください。