Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah `std::match_results::size()` menentukan bilangan padanan dalam ungkapan biasa?

Bagaimanakah `std::match_results::size()` menentukan bilangan padanan dalam ungkapan biasa?

Mary-Kate Olsen
Lepaskan: 2024-11-04 12:43:02
asal
358 orang telah melayarinya

How does `std::match_results::size()` determine the number of matches in a regular expression?

Menentukan Saiz Regex Padanan dengan std::match_results::size()

std::match_results::size() menyediakan cerapan tentang bilangan kumpulan padanan dan nilai padanan penuh dalam padanan regex. Mari kita mendalami fungsinya.

Dalam kod C 11, std::match_results::size() digunakan untuk mendapatkan maklumat tentang padanan regex. Ia mengembalikan kiraan yang merangkumi keseluruhan perlawanan serta mana-mana kumpulan tangkapan yang mungkin telah ditentukan dalam ungkapan biasa. Walau bagaimanapun, nilai yang diberikannya mungkin berbeza daripada jumlah perlawanan yang dijangkakan.

Pertimbangkan contoh berikut:

<code class="cpp">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

Dalam kes ini, anda mungkin menjangkakan mendapat keputusan daripada 3 perlawanan. Walau bagaimanapun, anda hanya akan menerima 1 kerana regex_search() mendapatkan hanya satu padanan. Fungsi size() melaporkan kiraan kumpulan tangkapan serta keseluruhan perlawanan.

Untuk menjelaskan, std::match_results memegang butiran padanan dan sebarang subpadanan yang ditemui. Jika carian regex berjaya, ia tidak akan kosong. Ia mengandungi satu siri objek sub_match, dengan yang awal mewakili padanan penuh. Objek sub_match lain dalam objek match_results sepadan dengan subkumpulan dalam ungkapan regex (ditunjukkan dengan kurungan).

Sebagai contoh, pertimbangkan ungkapan biasa berikut:

<code class="cpp">"ab(c)"</code>
Salin selepas log masuk

Ia mempunyai kumpulan tangkapan yang memerangkap watak "c." Kod berikut menggunakan std::regex_iterator untuk mencari berbilang padanan, melindungi daripada pemusnahan rentetan:

<code class="cpp">std::string str("abcdefabcghiabc");
std::regex rgx1("abc");
smatch smtch;
while (regex_search(str, smtch, rgx1)) {
    std::cout << smtch[0] << std::endl;
    str = smtch.suffix().str();
}</code>
Salin selepas log masuk

Kod ini mencetak "abc" tiga kali.

Sebagai alternatif, std::sregex_iterator boleh digunakan, menyediakan kaedah yang lebih cekap dan memelihara rentetan:

<code class="cpp">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() << "\n";
    std::cout << "    Capture: " << m[1].str() << "\n";
}</code>
Salin selepas log masuk

Kod ini mencetak padanan penuh dan nilai tangkapan, menawarkan pemahaman menyeluruh tentang tingkah laku std::match_results::size().

Atas ialah kandungan terperinci Bagaimanakah `std::match_results::size()` menentukan bilangan padanan dalam ungkapan biasa?. 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