Rumah > Artikel > pembangunan bahagian belakang > Mengapakah `std::match_results::size` mengembalikan 1 dan bukannya 3 untuk berbilang padanan dalam carian regex?
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>
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>
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>
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!