我是C ++正则表达式的新手,不能使用字符串而不是char *。到目前为止我看到的例子总是用于c字符串。
我真正的程序,我甚至不会尝试在这里显示,使用子匹配,但我不能 让它们工作,所以我试图修改一个非常简单的工作示例,但它也不起作用。我使用Visual Studio 2010 Ultimate。
原始 - 工作 - 代码:
const char *first = "abcd";
const char *last = first + strlen(first);
std::cmatch mr;
std::regex rx("abc");
std::regex_constants::match_flag_type fl = std::regex_constants::match_default;
std::cout << "search(f, l, \"abc\") == " << std::boolalpha
<< regex_search(first, last, mr, rx) << std::endl;
std::cout << " matched: \"" << mr.str() << "\"" << std::endl;
std::cout << "search(\"xabcd\", \"abc\") == " << std::boolalpha
<< regex_search("xabcd", mr, rx) << std::endl;
std::cout << " matched: \"" << mr.str() << "\"" << std::endl;
修改后的代码:
const string first = "abcd"; // char * => string
std::smatch mr; // cmatch => smatch
std::regex rx(string("abc"));
std::regex_constants::match_flag_type fl = std::regex_constants::match_default;
// this works:
std::cout << "search(f, l, \"abc\") == " << std::boolalpha
<< regex_search(first, mr, rx) << std::endl;
std::cout << " matched: \"" << mr.str() << "\"" << std::endl;
// after the next line executes mr seems good to me:
// mr[0] = {3, matched:true, first="abcd", second="d",...}
std::cout << "search(\"xabcd\", \"abc\") == " << std::boolalpha
<< regex_search(string("xabcd"), mr, rx) << std::endl;
// but the following line gives the error
// "Debug assertion failed"
// Expression: string iterators incompatible
std::cout << " matched: \"" << mr.str() << "\"" << std::endl;
奇怪的是,修改后的代码的一部分可以正常工作,而下一部分会导致异常。我甚至尝试使用mr [0] .str()但我得到了相同的错误消息。你能帮我解决这个问题吗?
答案 0 :(得分:10)
问题是临时问题之一。
smatch
将在您要搜索的字符串中包含迭代器。
regex_search(string("xabcd"), mr, rx)
在;
处创建去世的临时字符串。
因此,当您在下一行使用mr
时,它指的是无效的内存。 string
的有效期应超过mr
。