VC++2008のRegex
VC++2008では「標準 C++ ライブラリ TR(technical report)1 拡張」において、Boostから取り入れられた正規表現ライブラリRegexが使える。以下は、これを使ってみて気がついた点のメモ書きです。
VC++2008は「Visual C++ 2008 Express Edition SP1」。 Boostは1.33.1で、VC++2003と組み合わせた。
[1] Boost版とTR版ではヘッダファイルと名前空間が異なるので、コンパイラのバージョンによってVC++2008以降はTR版を、それ以外はBoost版を使うようにした。
#if defined(_MSC_VER) && (_MSC_VER >= 1500) // VC++2008以降
#include <regex>
#else
#include "boost/regex.hpp"
#endif
#if defined(_MSC_VER) && (_MSC_VER >= 1500) // VC++2008以降
using namespace std::tr1;
#else
using namespace boost;
#endif
Boost版ではRegex用ライブラリファイルをリンクするようにプロジェクトのプロパティを設定する必要があるが、TR版ではその必要がない。
[2] 次のコード
regex reg1("(Colo)(u)(r)", regex::icase);
std::string s1 = "Colour, colours, color, colourize, COLOUR";
std::string s2 = regex_replace(s1, reg1, "$1$3");
std::cout << s2 << std::endl;
は、「Boost C++をチューンアップする最先端ライブラリ」(ビョルン・カールソン(著) 村上雅章(訳) ピアソン・エデュケーション)のP137に載っている例で、イギリスの綴りcolourをアメリカの綴りcolorに変換するものだが、TR版では3行目でコンパイルエラーになる。
3行目を次のようにすると
std::string s2 = regex_replace(s1, reg1, std::string("$1$3"));
Boost版、TR版ともにコンパイルでき、実行結果は
Color, colors, color, colorize, COLOR
となる。
TR版ではフォーマット文字列として普通のC言語の文字列を受け付けるregex_replace関数が定義されていないようだ。
[3] regexのコンストラクタのflag_type引数に取り得る値はBoost版とTR版とで完全に一致していない。
たとえば、icaseは両方にあるが、perlはBoost版にあってTR版にない。
« VC++2008のスマートポインタ | トップページ | VC++2008のキャスト演算子(その1) »
「パソコン・インターネット」カテゴリの記事
- トップページにTooltip (jQueryを使ったオリジナル)(2008.12.20)
- JAVAのハッシュテーブル HashMap(2008.12.15)
- C#のハッシュテーブル Dictionary(2008.12.15)
- C++/C#/JAVA コレクション比較 【ハッシュテーブルの比較概要】(2008.12.12)
- C++/C#/JAVA コレクション比較 【インデックスによる要素アクセス】(2008.12.10)
コメント