嗨,所以我一直试图弄清楚如何正确捕捉这些群体而我不能:http://www.debuggex.com/r/xOmFR78EkK3mATN4/0
在示例中,我需要在test1 == 0
test2 == 1
和test3 == 2
中捕获表达式的每个部分。现在我只匹配test1和test3我无法弄清楚我是怎么做的得到所有正确匹配的表达式。
我将使用C ++并提升正则表达式,但这不应该改变任何东西
答案 0 :(得分:1)
我认为你的test2没有被捕获,因为它被第7组捕获,但第7组的内容在匹配test3时会被覆盖。
对于boost regex,请查看match_flag_type
的文档,特别是match_extra
。
答案 1 :(得分:1)
您可以使用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,上面应该是Just Work。 Xpressive是一个仅限标头的库;也就是说,它不需要构建。
使用Xpressive的semantic actions可以提高效率。这并不困难,但是放弃了很多你熟悉的正则表达式语法。
另一种选择是使用Boost.Spirit构建一个简单的解析器,它也只是标题。
HTH!