Rumah > pembangunan bahagian belakang > C++ > Mengapakah `std::match_results::size` tidak mengembalikan bilangan padanan dalam rentetan?

Mengapakah `std::match_results::size` tidak mengembalikan bilangan padanan dalam rentetan?

Barbara Streisand
Lepaskan: 2024-11-07 22:16:02
asal
889 orang telah melayarinya

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

Apakah std::match_results::size return, dan mengapa ia tidak sepadan dengan bilangan padanan?

std ::match_results::size function dalam C 11 mengembalikan bilangan kumpulan tangkapan tambah satu untuk keseluruhan nilai padanan. Dalam kod 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;
}
Salin selepas log masuk

anda mungkin menjangkakan outputnya ialah 3, kerana rentetan "abc" muncul tiga kali dalam timbunan jerami. Walau bagaimanapun, output sebenarnya ialah 1. Ini kerana regex_search hanya mengembalikan satu padanan, dan size() mengembalikan bilangan kumpulan tangkapan ditambah nilai padanan keseluruhan.

Dalam kes ini, tiada kumpulan tangkapan, jadi size() mengembalikan 1 untuk keseluruhan nilai padanan. Jika anda ingin mencari semua padanan "abc" dalam timbunan jerami, anda boleh menggunakan fungsi std::regex_search dengan berbilang parameter:

<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;
}
Salin selepas log masuk

Kod ini akan mencari timbunan jerami untuk semua padanan "abc" dan simpannya dalam vektor padanan. Fungsi size() kemudiannya akan mengembalikan bilangan padanan yang ditemui, iaitu 3 dalam kes ini.

Penyelesaian alternatif

Terdapat kaedah lain untuk mencari berbilang padanan dalam seutas tali. Satu kaedah ialah menggunakan 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;
}
Salin selepas log masuk

Kod ini akan kembali:

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
Salin selepas log masuk

Kaedah lain ialah menggunakan fungsi 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>
Salin selepas log masuk

Kod ini juga akan mengembalikan 3.

Atas ialah kandungan terperinci Mengapakah `std::match_results::size` tidak mengembalikan bilangan padanan dalam rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan