>백엔드 개발 >C++ >`std::match_results::size()`는 정규식에서 일치 항목 수를 어떻게 결정합니까?

`std::match_results::size()`는 정규식에서 일치 항목 수를 어떻게 결정합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-04 12:43:02269검색

How does `std::match_results::size()` determine the number of matches in a regular expression?

std::match_results::size()

std::match_results::size()를 사용하여 정규식 일치 크기 결정 일치 그룹 수와 정규식 일치 내의 전체 일치 값에 대한 통찰력. 그 기능을 자세히 살펴보겠습니다.

C 11 코드에서 std::match_results::size()는 정규식 일치에 대한 정보를 얻는 데 사용됩니다. 전체 일치 항목과 정규식에 지정되었을 수 있는 캡처 그룹을 포함하는 개수를 반환합니다. 그러나 제공되는 값은 예상 일치 수와 다를 수 있습니다.

다음 예를 고려하세요.

<code class="cpp">std::string haystack("abcdefabcghiabc");
std::regex needle("abc");
std::smatch matches;
std::regex_search(haystack, matches, needle);
std::cout << matches.size() << std::endl;</code>

이 경우 3개의 일치 결과를 얻을 것으로 예상할 수 있습니다. 그러나 regex_search()는 일치하는 항목을 하나만 검색하므로 1개만 받게 됩니다. size() 함수는 캡처 그룹 수와 전체 일치 항목을 보고합니다.

명확하게 설명하기 위해 std::match_results는 일치 세부 정보와 발견된 모든 하위 일치 항목을 보유합니다. 정규식 검색이 성공하면 비어 있지 않습니다. 여기에는 일련의 sub_match 개체가 포함되어 있으며 초기 개체는 전체 일치를 나타냅니다. match_results 개체의 다른 sub_match 개체는 정규식 내의 하위 그룹에 해당합니다(괄호로 표시).

예를 들어 다음 정규식을 고려하세요.

<code class="cpp">"ab(c)"</code>

다음과 같은 캡처 그룹이 있습니다. 문자 "c"를 트랩합니다. 다음 코드는 std::regex_iterator를 사용하여 여러 일치 항목을 찾아 문자열 파괴를 방지합니다.

<code class="cpp">std::string str("abcdefabcghiabc");
std::regex rgx1("abc");
smatch smtch;
while (regex_search(str, smtch, rgx1)) {
    std::cout << smtch[0] << std::endl;
    str = smtch.suffix().str();
}</code>

이 코드는 "abc"를 세 번 인쇄합니다.

또는 std::sregex_iterator를 사용할 수도 있습니다. 보다 효율적이고 문자열 보존 방법을 제공합니다.

<code class="cpp">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() << "\n";
    std::cout << "    Capture: " << m[1].str() << "\n";
}</code>

이 코드는 전체 일치 및 캡처 값을 인쇄하여 std::match_results::size() 동작에 대한 철저한 이해를 제공합니다.

위 내용은 `std::match_results::size()`는 정규식에서 일치 항목 수를 어떻게 결정합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.