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

Patricia Arquette
Lepaskan: 2024-11-04 20:48:02
asal
943 orang telah melayarinya

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

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

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

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!

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