サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]
#include <iostream>
#include <string>
#include <boost/regex.hpp>
using namespace std;
int main()
{
// <で始まって>で終わる文字列にマッチする正規表現で検索
boost::regex r( "<[^>]+>" );
boost::smatch m;
string str1 = "The HTML tag <title> means that ...";
if( boost::regex_search(str1, m, r) )
{
cout << "found (pos=" << m.position() << ")" << endl;
cout << " ==> " << m.str() << endl;
}
// マッチした部分を、前後に#を付けた文字列で置換する
boost::regex r2( "A([1-9]*|[a-z]*)A" );
string str2 = "A123A AaaaA A3b3A A9A";
{
cout <<
boost::regex_replace(
str2, r2, "#$0#", boost::format_all )
<< endl;
}
return 0;
}
found (pos=13) ==> <title> #A123A# #AaaaA# A3b3A #A9A#
このコンポーネントを使うためだけにboostを導入する、 という方もおそらく相当多いのではないかと思います。
標準の strstr
関数や std::string::find
では、完全にピッタリと一致する部分を探すことはできても、
「tで始まる単語」みたいな幅のある検索をすることは、
当たり前ですが出来ません。その辺りの強力な文字列処理をしたい時には、
各種スクリプト言語や、最近ではJavaなどでも正式にサポートされている
「正規表現」が必須となってきます。その機能を実装したのがこのライブラリ。
慣れるとかなり便利です。
このライブラリは、Boost 1.31 でクラス名や関数名を中心に、 大幅な変更が加えられました。旧バージョンを使用されていた方は注意が必要です。
旧バージョンベースの解説ですが、Boost.Regexの詳細記事としては、
επιστημη氏による次のページがGoodです。(reg_expression
の代わりに basic_regex
としておけば、
だいたいのサンプルは動くみたいです。)
あと、Boostにはもう一つ別の新しい正規表現ライブラリ Xpressive があります。
また、Boost.Regex のインターフェイスを基本的に踏襲した形で、標準ライブラリ拡張案 TR1 に正規表現が実装されています。最新のC++コンパイラではTR1の正規表現も使用可能です。