C++で正規表現を使う時、boost::regexを使うことが多いと思っていたのですが、何故か1.46.1以降(といっても1.48.0しか試していませんが)、regex_search,regex_matchがNullPointerExceptionぽく落ちるので、解決方法を探していました。
そこで、試してみたのがGoogle製の正規表現エンジン Re2です。
インストールは簡単です。Mercurialが必要ですが、Ubuntuではaptで簡単に入ります。(ちなみに、Ubuntu11.04で試しました)
[2011/11/28追記]
もう少しだけ詳しい使用例を書きました!
まず、入っていなければMercurialのインストールです。sudo apt-get install mercurialで、適当な所にre2をcloneして、インストールです。hg clone https://re2.googlecode.com/hg re2 cd re2 make test sudo make install make testinstallで、試してみたコードが以下のものになります。 gist:1393431#include <iostream> #include <string> #include <re2/re2.h> #include <cassert> using namespace std; int main(int argc, char **argv){ string s,t; string str("あぶらかたぶら"); RE2 re1("(.ら).(.ぶ)"); assert(re1.ok()); if(RE2::PartialMatch(str, re1 , &s, &t)) cout << "s:"<< s << " t:"<< t << endl; return 0; }出力結果はこうなりました。s:ぶら t:たぶ勿論、部分マッチだけでなく、FullMatchやReplaceもできます。 ただ、可変数マッチしたものを全部取り出すのはやり方わからないんですよねー。 マッチした物をeachで取り出す的なことがしたいんですが。 [2011/11/26追記] PartialMatchNを利用すれば解決できると、@unnonounoさんに教えていただきました! ただ、結構トリッキーなので、下記記事中のサンプルコードを見るのが早いと思います。ありがとうございます! re2のxxxNの使い方:unnonouno exampleはre2.hにたくさんあるので参考にしてください。 とりあえず、正規表現だけ欲しければre2を使ってみるのもよいかもしれません。
参考URL:
Re2の使い方と疑問
RE2を試してみた。



正規表現ライブラリre2の簡単な使い方まとめ « once upon a time,
11月 26, 2011 @ 22:16:20