Вы можете использовать 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
Это делает стратегическое использование nested dynamic regexes, что я не верю библиотекой Boost.regex поддерживает. Хорошей новостью является то, что если у вас есть Boost, то выше должно быть просто работать. Xpressive - это библиотека только для заголовков; то есть его не нужно строить.
Вы можете сделать это намного эффективнее с помощью Xpressive's semantic actions. Это не сложнее, но вы отказываетесь от синтаксиса регулярного выражения, с которым вы хорошо знакомы.
Другим вариантом является создание простого анализатора с использованием Boost.Spirit, который также является заголовком.
HTH!
А ну, дерьмо, я не могу этого сделать из-за того, как была построена библиотека. У него нет дополнительного дополнения – csteifel
@legion Ну, это сложно, но не невозможно. Вы заметили, как эта часть вашего регулярного выражения представляет собой своего рода цикл? Должно быть возможно реализовать цикл в вашем коде и выполнять регулярное совпадение или поиск несколько раз, каждый раз изменяя начальную позицию. –