これにはBoost.Xpressiveを使用できます。
#include <iostream>
#include <boost/xpressive/xpressive.hpp>
using namespace boost::xpressive;
int main()
{
std::string str( "testrule: test1 == 0 && test2 == 1 && test3 == 2 ; test desc" );
sregex_compiler comp;
regex_constants::syntax_option_type x = regex_constants::ignore_white_space;
comp.compile("(? $test = )(([\\w\\.]+)\\s+(==|!=|>|<)\\s+([\\w\\.]+))", x);
sregex test = comp.compile("^(\\w+):\\s+(? $test )(\\s&&\\s(? $test ))*\\s*;\\s*(.*)$", x);
smatch what;
if(regex_match(str, what, test))
{
for(smatch const & nested : what.nested_results())
std::cout << nested[0].str() << std::endl;
}
}
このプログラムは以下を出力します。
test1 == 0
test2 == 1
test3 == 2
Boost.Regex がサポートしているとは思えない、ネストされた動的正規表現を戦略的に使用します。良いニュースは、Boost を使用している場合、上記の方法で問題なく動作することです。Xpressive はヘッダーのみのライブラリです。つまり、ビルドする必要はありません。
Xpressive のセマンティック アクションを使用すると、これをはるかに効率的に行うことができます。それほど難しくはありませんが、使い慣れた正規表現構文の多くを忘れてしまいます。
別のオプションは、 Boost.Spiritを使用して単純なパーサーを構築することです。これもヘッダーのみです。
チッ!