diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp index 561498ed0235..e1588d3752f6 100644 --- a/core/string/ustring.cpp +++ b/core/string/ustring.cpp @@ -3735,14 +3735,12 @@ int String::_count(const String &p_string, int p_from, int p_to, bool p_case_ins return 0; } int c = 0; - int idx = -1; - do { - idx = p_case_insensitive ? str.findn(p_string) : str.find(p_string); - if (idx != -1) { - str = str.substr(idx + slen, str.length() - slen); - ++c; - } - } while (idx != -1); + int idx = 0; + while ((idx = p_case_insensitive ? str.findn(p_string, idx) : str.find(p_string, idx)) != -1) { + // Skip the occurrence itself. + idx += slen; + ++c; + } return c; } @@ -3774,14 +3772,12 @@ int String::_count(const char *p_string, int p_from, int p_to, bool p_case_insen return 0; } int c = 0; - int idx = -1; - do { - idx = p_case_insensitive ? str.findn(p_string) : str.find(p_string); - if (idx != -1) { - str = str.substr(idx + substring_length, str.length() - substring_length); - ++c; - } - } while (idx != -1); + int idx = 0; + while ((idx = p_case_insensitive ? str.findn(p_string, idx) : str.find(p_string, idx)) != -1) { + // Skip the occurrence itself. + idx += substring_length; + ++c; + } return c; }