Apakah std::match_results::size return, dan mengapa ia tidak sepadan dengan bilangan padanan?
std ::match_results::size function dalam C 11 mengembalikan bilangan kumpulan tangkapan tambah satu untuk keseluruhan nilai padanan. Dalam kod 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; }
anda mungkin menjangkakan outputnya ialah 3, kerana rentetan "abc" muncul tiga kali dalam timbunan jerami. Walau bagaimanapun, output sebenarnya ialah 1. Ini kerana regex_search hanya mengembalikan satu padanan, dan size() mengembalikan bilangan kumpulan tangkapan ditambah nilai padanan keseluruhan.
Dalam kes ini, tiada kumpulan tangkapan, jadi size() mengembalikan 1 untuk keseluruhan nilai padanan. Jika anda ingin mencari semua padanan "abc" dalam timbunan jerami, anda boleh menggunakan fungsi std::regex_search dengan berbilang parameter:
<code class="cpp">int main() { std::string haystack("abcdefabcghiabc"); std::regex needle("abc"); std::vector<std::smatch> matches; std::regex_search(haystack, needle, matches, std::regex_constants::match_continuous); std::cout << matches.size() << std::endl; }
Kod ini akan mencari timbunan jerami untuk semua padanan "abc" dan simpannya dalam vektor padanan. Fungsi size() kemudiannya akan mengembalikan bilangan padanan yang ditemui, iaitu 3 dalam kes ini.
Penyelesaian alternatif
Terdapat kaedah lain untuk mencari berbilang padanan dalam seutas tali. Satu kaedah ialah menggunakan std::sregex_iterator:
<code class="cpp">int main() { 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'; } return 0; }
Kod ini akan kembali:
Match value: abc at Position 0 Capture: c at Position 2 Match value: abc at Position 6 Capture: c at Position 8 Match value: abc at Position 12 Capture: c at Position 14
Kaedah lain ialah menggunakan fungsi std::regex_match:
<code class="cpp">int main() { std::regex r("abc"); std::string s = "abcdefabcghiabc"; std::vector<std::string> matches; std::smatch match; while (std::regex_search(s, match, r)) { matches.emplace_back(match[0]); s = match.suffix().str(); } std::cout << matches.size() << std::endl; }</code>
Kod ini juga akan mengembalikan 3.
Atas ialah kandungan terperinci Mengapakah `std::match_results::size` tidak mengembalikan bilangan padanan dalam rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!