如何使用std :: regex_search的结果?

时间:2019-05-29 18:10:47

标签: c++ regex string clr

我只是打电话给

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

由于某些原因而不起作用(出现不兼容的字符串迭代器错误)。 肯定有一些技巧。我会让一个知道的人解释。

1 个答案:

答案 0 :(得分:1)

您是正确的,您可以将匹配项分配给std::string;您没有使用流插入功能。

但是,您的第三个示例崩溃是因为std::smatch保留了对原始源数据中位置的引用/句柄…在您崩溃的情况下,这是临时strT.GetString(),它在正则表达式中就超出了范围完成(读取here)。

您的第二个例子是正确的。

我承认,乍一看C ++ regex实现并不完全直观。