gpt4 book ai didi

发现 C++ 正则表达式子字符串错误模式

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:50 26 4
gpt4 key购买 nike

我试图理解 C++ 中 regex 的逻辑

std::string s ("Ni Ni Ni NI");
std::regex e ("(Ni)");

std::smatch sm;
std::regex_search (s,sm,e);
std::cout << "string object with " << sm.size() << " matches\n";

这种形式不应该给我匹配我的模式的子字符串的数量吗?因为它总是给我 1 个匹配项并且它说匹配项是 [Ni , Ni]; 但我需要它来找到每个模式;它们应该是 3 并且像这样 [Ni][Ni][Ni]

最佳答案

函数 std::regex_search 只返回在您的字符串中找到的第一个匹配项的结果。

这是一个代码,从你的和 cplusplus.com 合并而来。这个想法是搜索第一个匹配项,对其进行分析,然后使用字符串的其余部分重新开始(也就是说,直接跟随找到的匹配项的子字符串,可以通过 match_results::suffix 检索到) .

请注意,正则表达式有两个捕获组 (Ni*)([^ ]*)

std::string s("the knights who say Niaaa and Niooo");
std::smatch m;
std::regex e("(Ni*)([^ ]*)");

while (std::regex_search(s, m, e))
{
for (auto x : m)
std::cout << x.str() << " ";

std::cout << std::endl;
s = m.suffix().str();
}

这给出了以下输出:

Niaaa Ni aaa

Niooo Ni ooo

如您所见,对于每次调用 regex_search,我们都有以下信息:

  • 整场比赛的内容,
  • 每个捕获组的内容。

因为我们有两个捕获组,这为每个 regex_search 提供了 3 个字符串。

编辑:在你的情况下,如果你想检索每个“Ni”,你需要做的就是替换

std::regex e("(Ni*)([^ ]*)");

std::regex e("(Ni)");

不过,您仍然需要遍历您的字符串。

关于发现 C++ 正则表达式子字符串错误模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25648620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com