编辑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()会在这里工作。那是因为这是一个简单的示例案例。在实际应用中,提升势在必行。
答案 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