once upon a time,

Iris Tradをビール片手に聞くのが好きなエンジニアが、機械学習やRubyにまつわる話を書きます

Google製の正規表現エンジンRe2を日本語で試してみた

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を試してみた。