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

标签 c++ regex

我试图理解 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/

相关文章:

php - 在不编写扩展的情况下在 PHP 中使用 C/C++ 代码

c++ - std::unordered_map 不释放内存

c++ - 如何编写具有仅 move 属性的函数?

c++ - eclipse C++。包含带有类的 .h 文件。 "Symbol ' [类 ]' could not be resolved"

没有 matcher.find(),Java Regex : Why matcher. group() 不起作用?

c++ - Qt C++串口类的继承

c++ - Visual Studio 正则表达式

javascript - 在javascript中使用正则表达式提取单词

java - 获取字符串模式

java - 正则表达式读取字符串 matcher.matches 第一个字符串不正确匹配