如何使用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++ 正则表达式的实现乍一看并不完全直观。
我只是打电话
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++ 正则表达式的实现乍一看并不完全直观。