boost::regex を使って Perl の split みたいなことをやる方法2007年06月06日 15時34分02秒

次の宿題もやってみた。

  1. Perl の split 関数に相当する記述法はないか?
    • boost::regex_split も deprecated 。つかこいつも使い勝手が微妙くさいなぁ。。。回りくどいというか。

前回の解答match_results::prefix()match_results::suffix() を見つけた時点でもう解けたも同然ではあったのですが、念のため。以下、サンプル。

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

#include <boost/regex.hpp>

using namespace std;
using boost::regex;
using boost::sregex_iterator;

back_insert_iterator<vector<string> >
split(const string& pattern,
      const string& source,
      back_insert_iterator<vector<string> > phrases_it)
{
    sregex_iterator last_it;
    for (sregex_iterator it(source.begin(), source.end(), regex(pattern));
        it != sregex_iterator(); it++)
    {
        *phrases_it++ = it->prefix();
        last_it = it;
    }
    *phrases_it++ = last_it == sregex_iterator() ? source : last_it->suffix();

    return phrases_it;
}

inline void split(const string& pattern, const string& source, vector<string>& phrases)
{
    split(pattern, source, back_insert_iterator<vector<string> >(phrases));
}

int main()
{
    string text = "  foo, bar,  baz, ,ngan gu  , hogehu,,ga-- ";
    cout << text << endl;

    vector<string> phrases;
    split("\\s*,\\s*", text, phrases);
    for (vector<string>::const_iterator it = phrases.begin(); it < phrases.end(); it++)
        cout << '"' << (*it) << '"' << endl;

    return 0;
}

実際に動かしてみるとこんな感じになります。

C:\Program_1\vs8\regex_test_mb\debug>split_test.exe
  foo, bar,  baz, ,ngan gu  , hogehu,,ga-- 
"  foo"
"bar"
"baz"
""
"ngan gu"
"hogehu"
""
"ga-- "

C:\Program_1\vs8\regex_test_mb\debug>