【问题标题】:How to use the result of std::regex_search?如何使用 std::regex_search 的结果?
【发布时间】:2019-10-15 09:45:37
【问题描述】:

我只是在打电话

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

由于某种原因无法工作(带有不兼容的字符串迭代器错误)。 这肯定有什么诀窍。我让知道的人解释一下。

【问题讨论】:

  • 您只是想知道字符串是否与正则表达式匹配,还是想使用正则表达式搜索项目?
  • 使用sregex_token_iteratorsregex_iterator。也修复你的正则表达式,但这不是当前的问题。
  • 我的模式完全符合我的需要,非常感谢。我不明白如何在std::smatch m; var 中“读取”我的捕获。
  • @LightnessRacesinOrbit 似乎很可能。您可以将其写在答案中以便我接受吗?也可以通过放置 GetBuffer() 而不是 GetString() 来工作吗?虽然我可以看到必要性,但我不喜欢在一行中使用整个变量。
  • 是的,我认为这不是一个有用的骗局。重新打开并回答。

标签: c++ regex string clr


【解决方案1】:

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

但是,您的第三个示例崩溃了,因为 std::smatch 持有对原始源数据中位置的引用/句柄...... here)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多