はじめに
C++の新しい規格「C++0x」では、言語とライブラリの両面から便利な機能が追加されます。「TR1」(Technical Report 1)はC++0xのライブラリ部で、標準C++に新たに追加されるライブラリの多くはBoostの中から選ばれたものです。2008年春にリリースが予定されているVisual Studio 2008にも追加パッケージとして供給されるとの情報を得ています。
TR1に収録されたクラス/関数の中からいくつかをピックアップし、その概要と使い方を予習しておきましょう。
正規表現について
さまざまなアプリケーションの実装で必ずと言っていいほど必要となるのが文字列の処理です。簡単なところではファイル、ユーザー入力、あるいはネットワーク越しに手に入れた文字列を空白やカンマで区切るとか、特定の文字列の検索などがあります。
<string.h>(C++では<cstring>)や標準C++ライブラリのstd::string/wstringには各種の文字列操作関数が用意されていますが、いずれも極めて基本的なものばかりです。文字列中から特定の文字列を検索することはできますが、文字列のパターン照合となると相当面倒なコードを組み上げなくてはなりません。 例えば"07/12/25"のように、数字二桁を'/'で繋いで年月日を表現した文字列をテキストファイル内から抽出するのにはC/C++の標準関数/クラスだけでは骨が折れます。
一方、PerlやRubyといったスクリプト言語は文字列の処理が得意です。これらスクリプト言語の多くが正規表現をサポートしていることが文字列処理を得意としている大きな理由の1つと言えるでしょう。正規表現は単なる固定文字列ではなくパターンの照合/検索を可能にします。
TR1に組み入れられる正規表現ライブラリ「Regex」は文字列パターンの照合/検索/置換を行います。そこで用いられる文字列パターンすなわち正規表現(Regular Expression)の構文を以下にまとめておきます。なお、よく使われるものを選んだもので、完全なリストではありません。
- .:ワイルドカード
a.b
は axb
、 ayb
、 a3b
... にマッチし、ab
はマッチしません。- ^、 $:行頭/行末
- (, ):部分表現(sub-expression)
- *、 +、 ?:繰り返し
*
は直前の0回以上の繰り返し。 a*b
は b
、 ab
、 aab
...にマッチします。+
は直前の1回以上の繰り返し。 a+b
は ab
、 aab
にマッチし b
はマッチしません。?
は直前の0回もしくは1回の繰り返し。 a?b
は b
または ab
にマッチします。a{3}
は aaa
にマッチします。 a{2,4}
は a
の2回以上4回以下の繰り返し: aa
、 aaa
、 aaaa
にマッチします。 a[2,}
は a
の2回以上の繰り返しを表します。- |:選択
|
の左右いずれか。brue|red
は blue
または red
にマッチします。apple|orange|banana
のように |
を複数用いてもかまいません。 - [,]:セット
[
と]
で囲まれた中の文字のいずれか。[abc]
は a
、b
またはc
にマッチします。-
で範囲を指定することができます。[a-c]
は a
、 b
、 c
に、[a-cA-C]
は a
、 b
、 c
、 A
、 B
、 C
にマッチします。[
の直後に
^を置くことで"~以外"となります。[^a-zA-Z]
は英文字以外の任意の一文字にマッチします。 上記の記法を組み合わせてパターンを表現します。例えば す?(もも|うどん)
であれば「0または1個のす
に続いてもも
またはうどん
」なので もも
、 すもも
、 うどん
、 すうどん
のいずれかがマッチします。
正規表現すなわち照合/検索パターンを司るのがクラステンプレート basic_regex<CharT,Traits,Allocator>
です。char
、wchar_t
のどちらのパターンを用いるかに応じて2つの短縮名が定義されています。
typedef basic_regex<char> regex; typedef basic_regex<wchar_t> wregex;