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

3.4 パターン一致

RWCString クラスは、文字列検索用の便利なインタフェースを持っています。以下の例をご覧ください。

RWCString s("curiouser and curiouser.");
size_t i = s.index("curious");

ここでは、s の中で curious の最初に一致する開始部分を検出します。比較は大文字と小文字の区別を付けて行われ、結果は i が 0 に設定されます。次の一致を検索するには、以下のようにします。

i = s.index("curious", ++i);

この結果 i は 14.に設定されます。大文字と小文字の区別をしないようにするには、次のようにします。

RWCString s("Curiouser and curiouser.");
size_t i = s.index("curious", 0, RWCString::ignoreCase);

これも、結果は i が 0 になります。

文字列に一致するパターンがない場合、index() は特殊値 RW_NPOS を返します。

3.4.1 単純な正規表現

パターン一致機能の一部として、Tools.h++ クラスライブラリでは、正規表現の検索に対応しています。正規表現の構文について詳しくは、『Tools.h++ Class Reference』の「RWCRegexp」を参照してください。正規表現を使って部分文字列を返すことができます。例えば、次のようにして、Windows メッセージ (接頭辞 WM_) と一致する文字列を抽出できます。

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

main(){
  RWCString a("A message named WM_CREATE");

  // Windows メッセージと一致する正規表現を構築する:
  RWCRegexp re("WM_[A-Z]*");
  cout << a(re) << endl;

  return 0;
}

出力:

WM_CREATE

RWCString の関数呼び出し演算子は、多重定義されており、型 RWCRegexp の引数を持ちます。これは、その正規表現と一致する RWCSubString を返すか、またはそのようなものが存在しない場合はヌルの部分文字列を返します。

3.4.2 拡張正規表現

このバージョンの Tools.h++ クラスライブラリは、POSIX 2 仕様を規準にした拡張正規表現に対応しています (参考文献を参照)。拡張正規表現は、UNIX ユーティリティの lex および awk で使用される正規表現です。正規表現の構文について詳しくは、『Tools.h++ Class Reference』を参照してください。

注意:RWCRExpr は、使用コンパイラが例外処理と標準 C++ ライブラリに対応している場合にのみ、使用可能です。

メモリによって制限されているものの、拡張正規表現には長さの制限がありません。括弧を使ってサブ正規表現をグループ化したり、シンボル記号 _ を使ってパターン一致用の拡張正規表現を作成できます。

次の例は、拡張正規表現の機能のいくつかを示したものです。

#include "rw/rstream.h"
#include "rw/re.h"

main (){
  RWCRExpr  re("Lisa|Betty|Eliza");
  RWCString s("Betty II is the Queen of England.");

  s.replace(re, "Elizabeth");
  cout << s << endl;

  s = "Leg Leg Hurrah!";
  re = "Leg";
  s.replace(re, "Hip", RWCString::all);
  cout << s << endl;
}

出力:

Elizabeth II is the Queen of England. Hip Hip Hurrah!

RWCString
の関数呼び出し演算子は、多重定義されており、RWCRExpr
型の引数を持ちます。これは、表現が一致する RWCSubString
を返すか、そのような表現が存在しない場合はヌルの部分文字列を返します。