首页  >  文章  >  后端开发  >  为什么 `std::match_results::size()` 对于没有捕获组的正则表达式返回 1?

为什么 `std::match_results::size()` 对于没有捕获组的正则表达式返回 1?

DDD
DDD原创
2024-11-05 02:25:01310浏览

Why does `std::match_results::size()` return 1 for a regex without capture groups?

std::match_results 的大小

问题:

在以下 C 11 代码中,为什么 matches.size() 返回 1 而不是预期的 3?

<code class="cpp">#include <iostream>
#include <string>
#include <regex>

int main() {
    std::string haystack("abcdefabcghiabc");
    std::regex needle("abc");
    std::smatch matches;
    std::regex_search(haystack, matches, needle);
    std::cout << matches.size() << std::endl;
}</code>

答案:

std::match_results 的 size() 函数返回捕获组数加1,表示完全匹配。在本例中,没有捕获组,因此大小为 1。

说明:

regex_search 函数查找输入中正则表达式的第一次出现细绳。在本例中,它在字符串的开头找到“abc”。 matches 对象包含有关匹配的信息,包括捕获组。

但是,提供的正则表达式不包含捕获组。捕获组是正则表达式中与输入字符串的特定部分匹配的括号。如果使用捕获组,matches.size() 将返回捕获组的数量加 1。

查找多个匹配项:

要查找多个匹配项,您可以使用迭代匹配的替代方法:

<code class="cpp">int main() {
    std::regex r("abc");
    std::string s = "abcdefabcghiabc";
    int i = 0;
    std::sregex_iterator it(s.begin(), s.end(), r);
    std::sregex_iterator end;
    while (it != end) {
        std::smatch m = *it;
        std::cout << i++ << ": " << m.str() << std::endl;
        it++;
    }
    return 0;
}</code>

此代码将打印:

0: abc
1: abc
2: abc

以上是为什么 `std::match_results::size()` 对于没有捕获组的正则表达式返回 1?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn