在 C++ 中使用 std::regex 匹配精确的子字符串

Posted

技术标签:

【中文标题】在 C++ 中使用 std::regex 匹配精确的子字符串【英文标题】:matching exact substring using std::regex in C++ 【发布时间】:2014-07-18 20:57:20 【问题描述】:

我正在尝试制作一个正则表达式来匹配一个精确的子字符串,以便我可以将它从字符串中删除。

std::string str = "abcslkj skdjvabcnei slkjdf";
std::regex reg("abc");
str = std::regex_replace(str, reg, "");

我在Regexr 上尝试了这个正则表达式,它可以工作(它与我想要的 abc 匹配)。但是,上面的代码似乎陷入了无限循环。

我想使用正则表达式的原因是因为我还使用它来删除不只是字符串匹配的其他内容,所以我不是在寻找像here 给出的答案那样的直接字符串操作。

正则表达式字符串实际上应该是什么才能匹配该特定字符串?

【问题讨论】:

找不到正则表达式匹配项到底是如何使您的代码在无限循环中运行的? 这是一个很好的问题,但我没有答案。它卡在 regex_replace 中。 :| abc 是无效的正则表达式,因为 旨在用于重复计数。例如,a1,3 匹配 1-3 个 a 字符。输入格式错误,不仅仅是找不到匹配项。我最好的猜测是它试图找到空字符串的重复项,因此在搜索中永远不会取得进展,但我不确定。 【参考方案1】:

如果你想真正匹配abc,你需要使用正则表达式\abc\ 是正则表达式中的特殊标记,因此必须对其进行转义。

【讨论】:

别忘了,反斜杠本身必须在字符串文字中进行转义,除非您使用原始字符串文字。 我最初尝试过 \abc\ 但 Xcode 告诉我 \ 是无效的转义序列。反斜杠本身的转义是我所需要的。谢谢! @mxdg 不,不要转义反斜杠,使用原始字符串文字,假设您的编译器支持它 - std::regex reg(R"(\abc\)");

以上是关于在 C++ 中使用 std::regex 匹配精确的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

C ++正则表达式替换第一个匹配项

带有 -fpack-struct 段错误的 gcc std::regex

std::regex_match 和 std::regex_search 之间的区别?

如何在 C++ 中对多个正则表达式使用正则表达式“分组”?

为啥 std::regex_match 会产生不同的结果

使用范围参数覆盖的 std::regex_search 无法编译 [重复]