我只是打电话给
std::smatch m;
if (std::regex_search
(std::string (strT.GetString ()),
m,
std::regex ("((\\d[\\s_\\-.]*){10,13})")))
{
...
}
我一生都无法找出如何从m中提取匹配的值。
主题上的每个页面都会将其写入cout,这对我来说毫无用处。我只想获取字符串中捕获的内容,但是无论我尝试什么,它都会因“字符串迭代器不兼容”错误消息而崩溃。
好的,所以我尝试了更多的事情,但又增加了很多烦恼,最主要的是关于同一代码如何在在线测试仪中工作,而在我的计算机上却没有。我归结为这个
std::string s (strT.GetString ()) ;
std::smatch m;
if (std::regex_search (
s,
m,
std::regex ("((\\d[\\s_\\-.]*){10,13})")))
{
std::string v = m[ 0 ] ;
}
有效,但这
std::smatch m;
if (std::regex_search (
std::string (strT.GetString ()),
m,
std::regex ("((\\d[\\s_\\-.]*){10,13})")))
{
std::string v = m[ 0 ] ;
}
由于某些原因而不起作用(出现不兼容的字符串迭代器错误)。 肯定有一些技巧。我会让一个知道的人解释。
答案 0 :(得分:1)
您是正确的,您可以将匹配项分配给std::string
;您没有使用流插入功能。
但是,您的第三个示例崩溃是因为std::smatch
保留了对原始源数据中位置的引用/句柄…在您崩溃的情况下,这是临时strT.GetString()
,它在正则表达式中就超出了范围完成(读取here)。
您的第二个例子是正确的。
我承认,乍一看C ++ regex实现并不完全直观。