嗨所以我一直试图弄清楚如何正确捕获这些组,但我不能: http: //www.debuggex.com/r/xOmFR78EkK3mATN4/0
在示例中,我需要捕获表达式的每个单独部分,test1 == 0
test2 == 1
并且test3 == 2
现在我只匹配 test1 和 test3 我无法弄清楚如何才能正确匹配所有表达式。
我将使用 C++ 并提升正则表达式,尽管这不会改变任何东西
嗨所以我一直试图弄清楚如何正确捕获这些组,但我不能: http: //www.debuggex.com/r/xOmFR78EkK3mATN4/0
在示例中,我需要捕获表达式的每个单独部分,test1 == 0
test2 == 1
并且test3 == 2
现在我只匹配 test1 和 test3 我无法弄清楚如何才能正确匹配所有表达式。
我将使用 C++ 并提升正则表达式,尽管这不会改变任何东西
我认为您的 test2 没有被捕获,因为它被第 7 组捕获,但是第 7 组的内容在与 test3 匹配时被覆盖。
对于 boost regex,请查看文档match_flag_type
,特别是match_extra
.
您可以为此使用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构建一个简单的解析器,它也只是标题。
!