查找提升匹配结果中的不匹配

时间:2012-07-04 13:20:01

标签: c++ regex boost

我正在使用boost :: regex_match,我正在尝试找到一个函数来获取正则表达式停止匹配的位置。我在boost :: match_results对象中找不到任何属性,但有几个代码片段,其中boost :: regex_search用于显示子匹配。我是否在实施的正确道路上或者为了达到这个目的而做一些不同的事情?我的代码如下:

int main(int args, char** argv)
{
    boost::match_results<std::string::const_iterator> what;

    if(args == 3) 
    {
        std::string text(argv[1]);
        boost::regex expression(argv[2]);

        std::cout << "Text : " << text << std::endl;
        std::cout << "Regex: " << expression << std::endl;

        if(boost::regex_match(text, what, expression, boost::match_default) != 0) 
        {
            int i = 0;

            for(boost::match_results<std::string::const_iterator>::const_iterator it=what.begin(); it!=what.end(); ++it) 
            {
                std::cout << "[" << (i++) << "] " << it->str() << std::endl;
            }
            std::cout << "Matched!" << std::endl;
        } 
        else 
        {
            std::string::const_iterator start = text.begin();
            std::string::const_iterator end   = text.end();

            while(boost::regex_search(start, end, what, expression)) 
            {
                std::string submatch(what[1].first, what[1].second);
                std::cout << submatch << std::endl;
                start = what[0].second;
            }
            std::cout << "Didn't match!" << std::endl;
        }
    } //if(args == 3)
    else 
    {
        std::cout << "Invalid usage! $> ./boost-regex <text> <regex>" << std::endl;
    }
    return 0;
}

输出:

$> ./boost_regex "We're building it up to burn it down" ".*(build.*)(to.*)(burn.*)"
Text : We're building it up to burn it down
Regex: .*(build.*)(to.*)(burn.*)
[0] We're building it up to burn it down
[1] building it up
[2] to
[3] burn it down
Matched!

$> ./boost_regex "We're building it up to burm it down" ".*(build.*)(to.*)(burn.*)"
Text : We're building it up to burm it down
Regex: .*(build.*)(to.*)(burn.*)
Didn't match!

对于最后一个输入,我希望有类似的东西:

Text : We're building it up to burm it down
Regex: .*(build.*)(to.*)(burn.*)
[0] We're building it up to
[1] building it up
[2] to
Didn't match!

提前致谢...

1 个答案:

答案 0 :(得分:1)

首先,您的示例中的正则表达式有问题。因为它与(burn.*)子组不匹配,所以整个正则表达式无法匹配任何内容,并且不返回任何结果。添加“?”在(burn.*)之后会使前两个子组匹配,而第三个子组则不匹配。

我会检查rubular.com,这是一个很好的工具,用于调整正则表达式并观察它们的实时工作。

要测试子组是否参与匹配,您需要检查for循环中的sub_match::matched布尔变量,如果子组匹配则为真。查看boost :: submatch here

的文档

希望这有帮助,它实际上是我的第一篇Stackoverflow帖子,回答或评论。 :)