正则表达式捕获重复的组

时间:2013-07-16 17:08:34

标签: c++ regex boost

嗨,所以我一直试图弄清楚如何正确捕捉这些群体而我不能:http://www.debuggex.com/r/xOmFR78EkK3mATN4/0

在示例中,我需要在test1 == 0 test2 == 1test3 == 2中捕获表达式的每个部分。现在我只匹配test1和test3我无法弄清楚我是怎么做的得到所有正确匹配的表达式。

我将使用C ++并提升正则表达式,但这不应该改变任何东西

2 个答案:

答案 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!