Was gibt std::match_results::size zurück und warum entspricht es nicht der Anzahl der Übereinstimmungen?
Der std Die Funktion ::match_results::size in C 11 gibt die Anzahl der Erfassungsgruppen plus eins für den gesamten Übereinstimmungswert zurück. In dem von Ihnen bereitgestellten Code:
<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; }
Sie könnten erwarten, dass die Ausgabe 3 ist, da die Zeichenfolge „abc“ dreimal im Heuhaufen vorkommt. Die Ausgabe ist jedoch tatsächlich 1. Dies liegt daran, dass regex_search nur eine Übereinstimmung zurückgibt und size() die Anzahl der Erfassungsgruppen plus den gesamten Übereinstimmungswert zurückgibt.
In diesem Fall gibt es keine Erfassungsgruppen, also size() gibt 1 für den gesamten Übereinstimmungswert zurück. Wenn Sie alle Übereinstimmungen von „abc“ im Heuhaufen finden möchten, können Sie die Funktion std::regex_search mit mehreren Parametern verwenden:
<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; }
Dieser Code durchsucht den Heuhaufen nach allen Übereinstimmungen von „abc“. und speichern Sie sie im Übereinstimmungsvektor. Die Funktion size() gibt dann die Anzahl der gefundenen Übereinstimmungen zurück, in diesem Fall 3.
Alternative Lösungen
Es gibt andere Methoden, um mehrere Übereinstimmungen zu finden eine Zeichenfolge. Eine Methode ist die Verwendung des 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; }
Dieser Code gibt Folgendes zurück:
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
Eine andere Methode ist die Verwendung der Funktion 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>
Dieser Code gibt auch 3 zurück.
Das obige ist der detaillierte Inhalt vonWarum gibt „std::match_results::size' nicht die Anzahl der Übereinstimmungen in einem String zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!