boost::xpressive

トップページ > 文字列 >

abstract

必要なヘッダ
<boost/xpressive/xpressive.hpp>
出来ること
正規表現
リファレンス
en / jp (pdf)

sample

サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]

#include <iostream>
#include <string>
#include <boost/xpressive/xpressive.hpp>
using namespace std;

int main()
{
	using namespace boost::xpressive;

	// <で始まって>で終わる文字列にマッチする正規表現で検索
	sregex  r = sregex::compile( "<[^>]+>" );
	smatch m;
	string str1 = "The HTML tag <title> means that ...";

	if( regex_search(str1, m, r) )
	{
		cout << "found (pos=" << m.position() << ")" << endl;
		cout << " ==> " << m.str() << endl;
	}

	// マッチした部分を、前後に#を付けた文字列で置換する
	sregex r2 = sregex::compile( "A([1-9]*|[a-z]*)A" );
	string str2 = "A123A AaaaA A3b3A A9A";
	cout << regex_replace( str2, r2, string("#$&#") ) << endl;

	// "static regex" 版
	r = '<' >> +(~as_xpr('>')) >> '>';

	if( regex_search(str1, m, r) )
	{
		cout << "found (pos=" << m.position() << ")" << endl;
		cout << " ==> " << m.str() << endl;
	}

	// "static regex" 版
	r2 = 'A' >> (*range('1','9') | *range('a','z')) >> 'A';
	cout << regex_replace( str2, r2, string("#$&#") ) << endl;

	return 0;
}

出力例

found (pos=13)
 ==> <title>
#A123A# #AaaaA# A3b3A #A9A#
found (pos=13)
 ==> <title>
#A123A# #AaaaA# A3b3A #A9A#

etc

Boostには現在、正規表現を扱うコンポーネントが2つあります。 ひとつはBoost.Regexで、もうひとつはこのBoost.Xpressiveです。

サンプルコードの上半分で示したように、Xpressiveは、 ほとんどRegexと同じような使い方をすることもできます。 いわゆる普通の正規表現をsregex::compile関数でコンパイルし、 regex_search や regex_replace 関数でその正規表現を使った処理を書くスタイルです。

Xpressiveはもう一つ、"static regex" という正規表現の記法をサポートしています。 サンプルコードの下半分がそれです。こちらでは、 spirit とよく似たC++の演算子を使った記法で正規表現を記述します。 文字列をコンパイルするより10~30%程度高速で、 しかも記述できるパターンの表現力も広いのが特徴です。

regexよりもspiritに近い構文解析力が欲しいのだけれど、spiritは汎用的すぎて使うのがややこしい (単純な検索/置換をしたいだけ)というときには、xpressiveがぴったりです。

see also

presented by k.inaba (kiki .a.t. kmonos.net) under CC0