SHOEISHA iD

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

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

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

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

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

正規表現「regex」

正規表現-照合:regex_match

 対象となる文字列が正規表現と一致するかを調べます。

regex_match (char版)
#include <iostream>
#include <string>
#include <boost/tr1/regex.hpp>

using namespace std;

int main() {
  // sourceがreにマッチするかを調べる。結果はresultsに。
  string source = "<a HREF='http://blogs.wankuma.com.episteme/'>";
  tr1::regex re("<[aA] +(href|HREF)=['\"](.*:)(.*)['\"].*>");
  tr1::smatch results;
  if ( tr1::regex_match(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:0,45:<a HREF='http://blogs.wankuma.com.episteme/'>
1:3,4:HREF
2:9,5:http:
3:14,29://blogs.wankuma.com.episteme/

 regex_matchには文字列(string)、正規表現(regex)そして結果を格納するsmatchを与えます。文字列が正規表現に完全マッチすればtrueを返します。戻り値がtrueのとき、smatchにマッチした文字列の詳細が格納されています。

 第n番目の部分マッチすなわち正規表現中N番目に現れる開きカッコ'('とそれに対応する閉じカッコ')'で囲まれた部分について、position(n)length(n)str(n) がそれぞれ先頭からの位置、長さ、文字列を返します(n=0は正規表現全体を表します)。

regex_match (wchar_t版)
#include <iostream>
#include <string>
#include <locale>
#include <boost/tr1/regex.hpp>

using namespace std;

int main() {
  wcout.imbue(locale("japanese"));
  wstring source = L"平成十九年十二月";
  tr1::wregex re(L"(平成|昭和|大正)(..?)年(..?)月");
  tr1::wsmatch results;
  if ( tr1::regex_match(source, results, re) ) {
    for ( size_t i = 0; i < results.size(); ++i ) {
      wcout << i << L':' <<  results.position(i) << L',' 
            << results.length(i) 
            << L':' << results.str(i) << endl;
    }
  }
}
実行結果
0:0,8:平成十九年十二月
1:0,2:平成
2:2,2:十九
3:5,2:十二

次のページ
正規表現-検索:regex_search、regex_iterator

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー