たくさん機能があるようなんですが、Web上であまり情報がなかったり、詳細はheaderファイル見てね!みたいなことが書かれていて、なかなかマスターするのが難しいライブラリです。特に、マッチ箇所(いわゆるgroup)が複数あるときにどうすればいいのかすぐにわかりません。私も以前ここではまって、色々調べてどうにか動いたことがありました。ちょうど@chezouさんが困っていたようなので、メモのつもりで晒してみましょう。
説明するより、コード読むがはやし、ということでサンプルを!
- #include <re2/re2.h>
- #include <string>
- #include <vector>
- #include <iostream>
- using namespace std;
- int main() {
- string pat = "(.)(.)(.)(.)";
- string text = "hoge";
- re2::RE2 re(pat);
- re2::StringPiece input(text);
- int groupSize = re.NumberOfCapturingGroups();
- vector<re2::RE2::Arg> argv(groupSize);
- vector<re2::RE2::Arg*> args(groupSize);
- vector<re2::StringPiece> ws(groupSize);
- for (int i = 0; i < groupSize; ++i) {
- args[i] = &argv[i];
- argv[i] = &ws[i];
- }
- re2::RE2::PartialMatchN(input, re, &(args[0]), groupSize);
- for (int i = 0; i < groupSize; ++i)
- cout << ws[i] << endl;
- }
基本的にxxxN関数を使えばOKのようです。まず、RE2オブジェクトのgroupの数はNumberOfCaptureingGroupsで取れます。xxxN関数には、書き込み先のArgへのポインタの配列を渡す必要があります。なので、Argポインタのvector(これを関数に渡す)と、Arg実態のvectorを作ります。実態の方には、それが書き込む先のStringPieceへのポインタを代入しておくといいようです。ここは、intポインタなどを代入すれば、intに変換されて代入されるでしょう。この辺は、なんとなく書いたのでもっと良い書き方があるのかもしれません。これでマッチさせれば、最終的にStringPieceのvectorに結果が代入されました。
0 件のコメント:
コメントを投稿