> 백엔드 개발 > C++ > `std::match_results::size`가 문자열의 일치 항목 수를 반환하지 않는 이유는 무엇입니까?

`std::match_results::size`가 문자열의 일치 항목 수를 반환하지 않는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-07 22:16:02
원래의
856명이 탐색했습니다.

Why does `std::match_results::size` not return the number of matches in a string?

std::match_results::size는 무엇을 반환하며, 일치 횟수와 일치하지 않는 이유는 무엇입니까?

std ::match_results::size C 11의 함수는 캡처 그룹 수에 전체 일치 값에 대해 1을 더한 값을 반환합니다. 제공한 코드에서는

<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;
}
로그인 후 복사

문자열 "abc"가 건초 더미에 세 번 나타나므로 출력이 3이 될 것으로 예상할 수 있습니다. 그러나 출력은 실제로 1입니다. 이는 regex_search가 일치 항목 하나만 반환하고 size()가 캡처 그룹 수와 전체 일치 값을 더한 값을 반환하기 때문입니다.

이 경우에는 캡처 그룹이 없으므로 캡처 그룹이 없습니다. size()는 전체 일치 값에 대해 1을 반환합니다. 건초 더미에서 "abc"와 일치하는 항목을 모두 찾으려면 여러 매개 변수와 함께 std::regex_search 함수를 사용할 수 있습니다.

<code class="cpp">int main() {
    std::string haystack("abcdefabcghiabc");
    std::regex needle("abc");
    std::vector<std::smatch> matches;
    std::regex_search(haystack, needle, matches, std::regex_constants::match_continuous);
    std::cout << matches.size() << std::endl;
}
로그인 후 복사

이 코드는 건초 더미에서 "abc"와 일치하는 모든 항목을 검색합니다. 일치 벡터에 저장합니다. 그러면 size() 함수는 발견된 일치 항목 수를 반환하며, 이 경우에는 3입니다.

대체 솔루션

여러 일치 항목을 찾는 다른 방법이 있습니다. 문자열. 한 가지 방법은 std::sregex_iterator를 사용하는 것입니다:

<code class="cpp">int main() {
    std::regex r("ab(c)");
    std::string s = "abcdefabcghiabc";
    for (std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
            i != std::sregex_iterator();
            ++i) {
        std::smatch m = *i;
        std::cout << "Match value: " << m.str() << " at Position " << m.position() << '\n';
        std::cout << "    Capture: " << m[1].str() << " at Position " << m.position(1) << '\n';
    }
    return 0;
}
로그인 후 복사

이 코드는 다음을 반환합니다:

Match value: abc at Position 0
    Capture: c at Position 2
Match value: abc at Position 6
    Capture: c at Position 8
Match value: abc at Position 12
    Capture: c at Position 14
로그인 후 복사

또 다른 방법은 std::regex_match 함수를 사용하는 것입니다:

<code class="cpp">int main() {
    std::regex r("abc");
    std::string s = "abcdefabcghiabc";
    std::vector<std::string> matches;
    std::smatch match;
    while (std::regex_search(s, match, r)) {
        matches.emplace_back(match[0]);
        s = match.suffix().str();
    }
    std::cout << matches.size() << std::endl;
}</code>
로그인 후 복사

이 코드도 3을 반환합니다.

위 내용은 `std::match_results::size`가 문자열의 일치 항목 수를 반환하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿