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

Barbara Streisand
Lepaskan: 2024-11-07 22:16:02
asal
781 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!

sumber:php.cn
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!