3

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

在示例中,我需要捕获表达式的每个单独部分,test1 == 0 test2 == 1并且test3 == 2现在我只匹配 test1 和 test3 我无法弄清楚如何才能正确匹配所有表达式。

我将使用 C++ 并提升正则表达式,尽管这不会改变任何东西

4

2 回答 2

1

我认为您的 test2 没有被捕获,因为它被第 7 组捕获,但是第 7 组的内容在与 test3 匹配时被覆盖。

对于 boost regex,请查看文档match_flag_type,特别是match_extra.

于 2013-07-16T17:35:12.497 回答
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

它战略性地使用了嵌套的动态正则表达式,我不相信 Boost.Regex 支持。好消息是,如果您有 Boost,上述内容应该可以正常工作。Xpressive 是一个只有头文件的库;也就是说,它不需要构建。

您可以使用 Xpressive 的语义操作来提高效率。这并不难,但确实放弃了您显然熟悉的大部分正则表达式语法。

另一种选择是使用Boost.Spirit构建一个简单的解析器,它也只是标题。

于 2013-07-16T23:54:38.277 回答