SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

BoostでC++0xのライブラリ「TR1」を先取りしよう

BoostでC++0xのライブラリ「TR1」を先取りしよう (2)

正規表現「regex」

正規表現-検索:regex_search、regex_iterator

 対象となる文字列から正規表現と一致する部分を見つけます。

 regex_searchの引数はregex_matchと同じです。regex_matchは与えた正規表現が文字列に完全マッチするかを調べるのに対し、regex_searchは正規表現が最初にマッチする範囲(位置と長さ)を探します。

regex_search (char版)
/* #include は省略 */
using namespace std;

int main() {
  string source
     = "c++ postscript visualbasic javascript java ecmascript";
  tr1::regex re("([^ ]+)script");
  tr1::smatch results;
  if ( tr1::regex_search(source, results, re) ) {
    for ( size_t i = 0; i < results.size(); ++i ) {
      cout << i << ':' << results.position(i) << ',' 
           << results.length(i) 
           << ':' << results.str(i) << endl;
    }
  }
}
実行結果
0:4,10:postscript
1:4,4:post

 regex_searchは文字列中の最初にマッチする部分を見つけますが、文字列からマッチ部分をすべて列挙したいならregex_iteratorが便利です。

regex_iterator (char版)
/* #include は省略 */
using namespace std;

int main() {
  // "なんたらscript"を列挙する
  string source
    = "c++ postscript visualbasic javascript java ecmascript";
  tr1::regex re("([^ ]+)script");
  tr1::sregex_iterator iter( source.begin(), source.end(), re);
  tr1::sregex_iterator last;
  while ( iter != last ) {
    for ( size_t i = 0; i < iter->size(); ++i ) {
      cout << i << ':' << iter->position(i) << ','
           << iter->length(i) << ':' 
           << iter->str(i) << ' ';
    }
    cout << endl;
    ++iter;
  }
}
実行結果
0:4,10:postscript 1:4,4:post
0:27,10:javascript 1:27,4:java
0:43,10:ecmascript 1:43,4:ecma
regex_iterator (wchar_t版)
/* #include は省略 */
using namespace std;

int main() {
  wcout.imbue(locale("japanese"));
  wstring source = L"うしかもしか";
  tr1::wregex re(L"うし|しか|かも|かもしか");
  tr1::wsregex_iterator iter( source.begin(), source.end(), re);
  tr1::wsregex_iterator last;
  while ( iter != last ) {
    for ( size_t i = 0; i < iter->size(); ++i ) {
      wcout << i << L':' << iter->position(i) << L',' 
            << iter->length(i) << L':' 
            << iter->str(i) << ' ';
    }
    wcout << endl;
    ++iter;
  }
}
実行結果
0:0,2:うし
0:2,2:かも
0:4,2:しか

次のページ
正規表現-置換:regex_replace

この記事は参考になりましたか?

BoostでC++0xのライブラリ「TR1」を先取りしよう連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1967 2008/01/07 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー