Boost.Regex の ICU 拡張と char32_t は相性がいいかも? このエントリーをはてなブックマークに追加

なんとなく Virtual Box から利用している Ubuntu のアップグレードなどをして、そこからなんとなく「やっぱり Long Time Release 版の Ubuntu もテスト環境に持っておきたいよなぁ」などと思いつつ Virtual Box ディスクイメージを追加でこさえて、 Boost ライブラリのセットアップなどもしつつ動作チェックも兼ねて昔書いた記事なんぞを掘り起こしておりましたら、そこに書かれた内容に関連して、そういえば Boost.Regex も ICU ライブラリと組み合わせれば Unicode に対応できたはずだよなぁなどということが気になりだしてしまいまして、いろいろ試しているうちに、以下のようなサンプルコードが問題なく動作してしまうことを発見してしまったのでメモしておこうかと思った次第なのであります。ああ、なんだかこちらのブログも口調が個人ブログや普段の Twitter とかでのそれに似てきてしまいました (^_^;A

#include <string>
#include <iostream>
#include <boost/regex.hpp>
#include <boost/regex/icu.hpp>

using namespace std;

using boost::u32regex;
using boost::u32match;

int main()
{
        u32string text(U"C++0x のせかいへようこそ!!");
        cout << "pre-modified text length = " << text.length() << endl;
        u32string modified;
        u32regex reg(reinterpret_cast<UChar32 const*>(U"せかい"));
        u32match match;
        while (boost::regex_search(reinterpret_cast<UChar32 const*>(text.c_str()), match, reg)) {
                modified += u32string(reinterpret_cast<char32_t const*>(match.prefix().str().c_str())) + U"世界";
                text = reinterpret_cast<char32_t const*>(match.suffix().str().c_str());
        }
        modified += text;
        cout << "modified text length = " << modified.length() << endl;
        return 0;
}

とりあえず動作確認環境は以下の通りです。

  • Ubuntu 11.04 + gcc 4.5.2 + Boost 1.42.0
  • Ubuntu 10.04 LTS + gcc 4.4.3 + Boost 1.40.0

どちらでもコンパイルコマンドは以下で通ります (ソースファイルを u32test.cpp として保存した場合)。

$ g++ -std=c++0x -o u32test u32test.cpp -lboost_regex

実行してみると、置換前と置換後の文字数が正しくカウントされており、マッチングが期待通りに動作していることが確認できます。

$ ./u32test
pre-modified text length = 17
modified text length = 16
$ 

ただ、コードを見ていただければわかる通り、 reinterpret_cast の嵐であり、こうした書き方が C++0x 的にも Boost.Regex 的にも ICU 的にも Valid なのかはわかりません。また、現時点では Windows 環境 (MinGW + gcc 4.5 など) での動作確認は行っておりません。 ICU 拡張部分のヘッダを見る限り、内部で wchar_t を使っているので、 wchar_t が 16bits 境界になっている Windows では、バイトオーダーがひっくり返るなどの問題があって、もしかしたら正常に動かないかもしれません。

あくまで参考までと言いますか、将来的にはこういう感じの書き方ができるようになると良いなぁと言う程度の妄想、と捉えていただければと思います… m(_ _)m

ちなみに、ここ最近ちっとも進んでいない otoco ですが、恐らく C++0x 自体の採用を見送る形になると思われます…。ただ、 Boost.Regex の ICU 拡張は有効利用できそうな気がしてきたので、こちらは利用することになるかもしれません。

Google の re2 に流れてしまいそうな悪寒もしてますが…。

2011 年 9 月 21 日 by 村山 俊之

タグ: , , , , ,

コメントをどうぞ