Rumah > pembangunan bahagian belakang > C++ > Mengapakah `std::match_results::size()` mengembalikan 1 untuk regex tanpa kumpulan tangkapan?

Mengapakah `std::match_results::size()` mengembalikan 1 untuk regex tanpa kumpulan tangkapan?

DDD
Lepaskan: 2024-11-05 02:25:01
asal
390 orang telah melayarinya

Why does `std::match_results::size()` return 1 for a regex without capture groups?

Saiz std::match_results

Soalan:

Dalam kod C 11 berikut , mengapa matches.size() mengembalikan 1 dan bukannya 3 yang dijangkakan?

<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

Jawapan:

Fungsi size() std::match_results kembali bilangan kumpulan tangkap tambah 1, menunjukkan perlawanan lengkap. Dalam kes ini, tiada kumpulan tangkapan, jadi saiznya ialah 1.

Penjelasan:

Fungsi regex_search mencari kejadian pertama ungkapan biasa dalam input rentetan. Dalam kes ini, ia menemui "abc" pada permulaan rentetan. Objek padanan mengandungi maklumat tentang perlawanan, termasuk kumpulan tangkapan.

Walau bagaimanapun, ungkapan biasa yang disediakan tidak mengandungi kumpulan tangkapan. Kumpulan tangkapan ialah kurungan dalam ungkapan biasa yang sepadan dengan bahagian tertentu rentetan input. Jika kumpulan tangkapan digunakan, matches.size() akan mengembalikan bilangan kumpulan tangkap tambah 1.

Mencari Berbilang Padanan:

Untuk mencari berbilang padanan, anda boleh gunakan pendekatan alternatif yang berulang pada perlawanan:

<code class="cpp">int main() {
    std::regex r("abc");
    std::string s = "abcdefabcghiabc";
    int i = 0;
    std::sregex_iterator it(s.begin(), s.end(), r);
    std::sregex_iterator end;
    while (it != end) {
        std::smatch m = *it;
        std::cout << i++ << ": " << m.str() << std::endl;
        it++;
    }
    return 0;
}</code>
Salin selepas log masuk

Kod ini akan mencetak:

0: abc
1: abc
2: abc
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah `std::match_results::size()` mengembalikan 1 untuk regex tanpa kumpulan tangkapan?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan