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

How to use the result of std::regex_search?

我只是打电话

std::smatch m;
if (std::regex_search 
  (std::string (strT.GetString ()), 
  m,
  std::regex ("((\d[\s_\-.]*){10,13})")))
{
  ...
}

我这辈子都想不出如何从 m 中提取匹配值。

关于该主题的每一页都将其写入 cout,这对我来说毫无价值。我只想获取字符串中捕获的内容,但无论我尝试什么,它都会崩溃并显示 "string iterators incompatible" 错误消息。

好的,所以我尝试了更多的东西,但对更多的东西感到恼火,最明显的是相同的代码在在线测试器中如何工作,但在我的电脑上却不行。我已经归结为这个

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

由于某种原因不工作(不兼容的字符串迭代器错误)。 它肯定有一些技巧。我让知道的人解释一下。

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

但是,您的第三个示例崩溃了,因为 std::smatch 将 references/handles 保留在原始源数据中的位置……在您崩溃的情况下,这是超出范围的临时 strT.GetString()正则表达式完成后立即(阅读 here)。

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

我承认 C++ 正则表达式的实现乍一看并不完全直观。