Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah `std::match_results::size()` menentukan bilangan padanan dalam ungkapan biasa?
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>
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>
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>
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>
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!