Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

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

正規表現「regex」

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/01/07 14:00

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;

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

著者プロフィール

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

    C++に首まで浸かったプログラマ。 Microsoft MVP, Visual C++ (2004.01~) だったり わんくま同盟でたまにセッションスピーカやったり 中国茶淹れてにわか茶人を気取ってたり、 あと Facebook とか。 著書: - STL標準講座 (監修) -...

バックナンバー

連載:BoostでC++0xのライブラリ「TR1」を先取りしよう
All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5