2

Edit8:我首先为可能遇到同样问题的任何人发布了解决方案。

解决方案

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

#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 编译

Edit3:我还尝试将声明正则表达式字符串的行更改为

std::string rstr = ".*";

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

依然没有。

Edit4:我没有得到以下结果,仍然没有结果:

#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;
    }

Edit5:我期待此时有两个匹配项,即 str 开头和结尾处的“foo”。

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

Edit7:我知道 strstr() 会在这里工作。这是因为这是一个简单的示例案例。Boost 在实际应用中是必不可少的。

4

2 回答 2

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;
}

对我来说,这打印:

在偏移量 0 处找到匹配项
在偏移量 6 处找到匹配项
于 2012-10-31T05:38:25.763 回答
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

于 2012-10-31T01:40:37.593 回答