Rumah > Artikel > pembangunan bahagian belakang > Mengapakah `std::match_results::size()` mengembalikan 1 untuk regex tanpa kumpulan tangkapan?
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>
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>
Kod ini akan mencetak:
0: abc 1: abc 2: abc
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!