我的模式似乎与外部正则表达式测试器相匹配,但我的程序失败了。我的代码出了什么问题? 我将不胜感激任何评论
我的代码:
std::smatch matches;
s = "y=a^b,z=(y+76),k=(z|p)";
for (int t=0; t<4; t++) {
try {
std::regex expr ( "((\\w+)=\\((\\w+)([\\|&\\^\\+\\-\\*])(\\w+)\\))" , regex_constants::extended ); // regex::extended|regex_constants::basic
std::regex_match(s, matches, expr);
if ( matches.empty() ) puts ("No Match !");
答案 0 :(得分:3)
首先,GCC在4.9之前不支持<regex>
,您必须升级或切换到另一个编译器(例如clang或MSVC)或使用boost.regex。
其次,regex_match尝试匹配整个字符串,它将失败。您需要regex_search或regex_iterator
第三,你的正则表达式不是一个有效的POSIX ERE(至少根据libc ++和gcc 4.9),只需删除regex_constants:
#include <regex>
#include <iostream>
int main()
{
std::smatch matches;
std::string s = "y=a^b,z=(y+76),k=(z|p)";
std::regex expr(R"((\w+)=\((\w+)([|&^+*-])(\w+)\))"); // simplified a bit
for(auto it = std::sregex_iterator(s.begin(), s.end(), expr);
it != std::sregex_iterator();
++it)
{
std::cout << "Found a match: " << it->str() << "\n";
std::smatch m = *it;
std::cout << "prefix=[" << m.prefix() << "]\n";
for(std::size_t n = 0; n < m.size(); ++n)
std::cout << " m[" << n << "]=[" << m[n] << "]\n";
std::cout << "suffix=[" << m.suffix() << "]\n";
}
}