无法与boost xpressive动态正则表达式匹配

时间:2012-10-31 01:30:12

标签: c++ regex boost mingw boost-xpressive

编辑8:我首先向所有可能出现同样问题的人发布解决方案。

解决方案

使用=分配正则表达式而不是调用()运算符。工作得很好。那太愚蠢了。

#include <iostream>
#include <string>
#include <boost/xpressive/xpressive_dynamic.hpp>

int main()
{
    std::string str = "foobarfoo";
    boost::xpressive::sregex rex;
    std::string rstr = "foo";
    rex = boost::xpressive::sregex::compile(rstr, boost::xpressive::regex_constants::ECMAScript);
    if (boost::xpressive::regex_search(str, rex, boost::xpressive::regex_constants::match_continuous))
        std::cout << "Match found.";
    else
        std::cout << "No match found.";
    return 0;
}

原始问题

我已经和xpressive争了一段时间了,我还没有做任何事情。使用以下代码:

#include <iostream>
#include <string>
#include <boost/xpressive/xpressive_dynamic.hpp>

int main()
{
    std::string str = "foobar";
    boost::xpressive::sregex rex;
    std::string rstr = "foo";
    rex(boost::xpressive::sregex::compile(rstr));
    if (boost::xpressive::regex_match(str, rex))
        std::cout << "Match found.";
    else
        std::cout << "No match found.";
    return 0;
}

我找不到我期望的比赛。非常感谢帮助。

编辑:尝试将正则表达式编译行更改为

rex(boost::xpressive::sregex::compile(rstr, boost::xpressive::regex_constants::ECMAScript));

仍然没有。

Edit2:使用MinGW GCC 4.7进行编译

编辑3:我还尝试更改声明正则表达式字符串的行

std::string rstr = ".*";

std::string rstr = "(.*)";

仍然没有。

编辑4:我没有得到以下内容,仍然没有结果:

#include <iostream>
#include <string>
#include <boost/xpressive/xpressive_dynamic.hpp>

    int main()
    {
        std::string str = "foobarfoo";
        boost::xpressive::sregex rex;
        std::string rstr = "(foo)";
        rex(boost::xpressive::sregex::compile(rstr));//;, boost::xpressive::regex_constants::ECMAScript));
        if (boost::xpressive::regex_search(str, rex, boost::xpressive::regex_constants::match_default))
            std::cout << "Match found.";
        else
            std::cout << "No match found.";
        return 0;
    }

编辑5:我期待此时有两场比赛,str的开头和结尾都是“foo”。

Edit6:尝试使用match_continuous标志设置运行regex_search,希望我至少可以让它获取前缀。没有骰子。还尝试使用ECMAScript标志进行编译,并使用match_default和match_continuous标志运行regex_search。

编辑7:我知道strstr()会在这里工作。那是因为这是一个简单的示例案例。在实际应用中,提升势在必行。

2 个答案:

答案 0 :(得分:3)

#include <iostream>
#include <string>
#include <boost/xpressive/xpressive_dynamic.hpp>

int main()
{
    std::string str = "foobar";
    std::string rstr = "foo";
    boost::xpressive::sregex rex = boost::xpressive::sregex::compile(rstr);
    if (boost::xpressive::regex_search(str, rex))
        std::cout << "Match found." << std::endl;
    else
        std::cout << "No match found." << std::endl;
}

为我打印"Match found."。如果你想找到所有的比赛......

#include <iostream>
#include <string>
#include <boost/xpressive/xpressive_dynamic.hpp>

int main()
{
    std::string str = "foobarfoo";
    std::string rstr = "foo";
    boost::xpressive::sregex rex = boost::xpressive::sregex::compile(rstr);
    boost::xpressive::sregex_iterator it(str.begin(), str.end(), rex), end;

    for (; it != end; ++it )
        std::cout << "Match found at offset "
                  << ((*it)[0].first - str.begin())
                  << std::endl;
}

对我来说,打印:

Match found at offset 0
Match found at offset 6

答案 1 :(得分:2)

请尝试regex_search而不是regex_match

regex_match州的提升文档:

  

请注意,仅当表达式与整个输入序列匹配时,结果才为真。如果要在序列中的某个位置搜索表达式,请使用regex_search。如果要匹配字符串的前缀,请使用regex_search并设置标记match_continuous

http://www.boost.org/doc/libs/1_51_0/libs/regex/doc/html/boost_regex/ref/regex_match.html