SHOEISHA iD

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

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

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

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

正規表現「regex」

  • このエントリーをはてなブックマークに追加

C++の新しい規格「C++0x」に追加予定のライブラリ群「TR1」の概要を、Boost版を使って解説します(Visual Studio 2008にも追加パッケージとして供給される予定)。第2回は正規表現「regex」についてです。

  • このエントリーをはてなブックマークに追加

はじめに

 C++の新しい規格「C++0x」では、言語とライブラリの両面から便利な機能が追加されます。「TR1」(Technical Report 1)はC++0xのライブラリ部で、標準C++に新たに追加されるライブラリの多くはBoostの中から選ばれたものです。2008年春にリリースが予定されているVisual Studio 2008にも追加パッケージとして供給されるとの情報を得ています。

 TR1に収録されたクラス/関数の中からいくつかをピックアップし、その概要と使い方を予習しておきましょう。

 BoostのインストールについてはBoostでC++0xのライブラリ「TR1」を先取りしよう (1) をご覧ください。

正規表現について

 さまざまなアプリケーションの実装で必ずと言っていいほど必要となるのが文字列の処理です。簡単なところではファイル、ユーザー入力、あるいはネットワーク越しに手に入れた文字列を空白やカンマで区切るとか、特定の文字列の検索などがあります。

 <string.h>(C++では<cstring>)や標準C++ライブラリのstd::string/wstringには各種の文字列操作関数が用意されていますが、いずれも極めて基本的なものばかりです。文字列中から特定の文字列を検索することはできますが、文字列のパターン照合となると相当面倒なコードを組み上げなくてはなりません。 例えば"07/12/25"のように、数字二桁を'/'で繋いで年月日を表現した文字列をテキストファイル内から抽出するのにはC/C++の標準関数/クラスだけでは骨が折れます。

 一方、PerlやRubyといったスクリプト言語は文字列の処理が得意です。これらスクリプト言語の多くが正規表現をサポートしていることが文字列処理を得意としている大きな理由の1つと言えるでしょう。正規表現は単なる固定文字列ではなくパターンの照合/検索を可能にします。

  TR1に組み入れられる正規表現ライブラリ「Regex」は文字列パターンの照合/検索/置換を行います。そこで用いられる文字列パターンすなわち正規表現(Regular Expression)の構文を以下にまとめておきます。なお、よく使われるものを選んだもので、完全なリストではありません。

  • .:ワイルドカード
  • 任意の一文字。 a.baxbayba3b ... にマッチし、ab はマッチしません。
  • ^$:行頭/行末
  • それぞれ文字列の先頭と末尾を表します。
  • (, ):部分表現(sub-expression)
  • 正規表現中に現れるパターンの部分(グループ)を表します。
  • *+?:繰り返し
  • *は直前の0回以上の繰り返し。 a*bbabaab ...にマッチします。
    +は直前の1回以上の繰り返し。 a+babaab にマッチし b はマッチしません。
    ?は直前の0回もしくは1回の繰り返し。 a?bb または ab にマッチします。
    さらに{}によって繰り返しの回数を指定できます。a{3}aaa にマッチします。 a{2,4}aの2回以上4回以下の繰り返し: aaaaaaaaa にマッチします。 a[2,}a の2回以上の繰り返しを表します。
  • |:選択
  • |の左右いずれか。brue|redblue または red にマッチします。apple|orange|banana のように |を複数用いてもかまいません。
  • [,]:セット
  • []で囲まれた中の文字のいずれか。[abc]abまたはcにマッチします。-で範囲を指定することができます。[a-c]abc に、[a-cA-C] は abcABC にマッチします。
    [の直後に^を置くことで"~以外"となります。[^a-zA-Z] は英文字以外の任意の一文字にマッチします。

 上記の記法を組み合わせてパターンを表現します。例えば す?(もも|うどん) であれば「0または1個のに続いてももまたはうどん」なので ももすももうどんすうどん のいずれかがマッチします。

 正規表現すなわち照合/検索パターンを司るのがクラステンプレート basic_regex<CharT,Traits,Allocator>です。charwchar_tのどちらのパターンを用いるかに応じて2つの短縮名が定義されています。

正規表現クラス
typedef basic_regex<char>      regex;
typedef basic_regex<wchar_t>   wregex;

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
正規表現-照合:regex_match

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

  • このエントリーをはてなブックマークに追加
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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング