Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `std::match_results::size` mengembalikan 1 dan bukannya 3 untuk berbilang padanan dalam carian regex?

Mengapakah `std::match_results::size` mengembalikan 1 dan bukannya 3 untuk berbilang padanan dalam carian regex?

Patricia Arquette
Patricia Arquetteasal
2024-11-04 20:48:02877semak imbas

Why does `std::match_results::size` return 1 instead of 3 for multiple matches in a regex search?

std::match_results::size

Dalam C , std::match_results::size ialah fungsi yang mengembalikan bilangan padanan kumpulan ditambah padanan keseluruhan dalam carian regex. Adalah penting untuk ambil perhatian bahawa ia tidak mengembalikan jumlah bilangan padanan yang ditemui.

Dalam contoh yang anda berikan:

<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>

Anda menjangkakan matches.size() akan mengembalikan 3, tetapi sebaliknya , anda mendapat 1. Ini kerana regex_search hanya mengembalikan satu padanan dan size() mengembalikan bilangan kumpulan tangkapan serta keseluruhan nilai padanan. Dalam kes ini, tiada kumpulan tangkapan, jadi saiznya ialah 1 (keseluruhan padanan itu sendiri).

Untuk mendapatkan berbilang padanan, anda boleh menggunakan std::regex_iterator, yang ditunjukkan dalam kod alternatif berikut:

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

Kod ini memusnahkan rentetan input, jadi berikut ialah alternatif lain menggunakan std::sregex_iterator:

<code class="cpp">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';
}</code>

Pendekatan berasaskan iterator ini mengekalkan rentetan asal sambil membenarkan anda mengulang melalui perlawanan.

Atas ialah kandungan terperinci Mengapakah `std::match_results::size` mengembalikan 1 dan bukannya 3 untuk berbilang padanan dalam carian regex?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn