diff --git a/Tests/src/StringUtils.cpp b/Tests/src/StringUtils.cpp index 95abd5bc3..dde2cb83c 100644 --- a/Tests/src/StringUtils.cpp +++ b/Tests/src/StringUtils.cpp @@ -325,4 +325,6 @@ TEST_CASE("String replace") REQUIRE(osmscout::ReplaceString("", "a", "b").empty()); REQUIRE(osmscout::ReplaceString("abc", "", "b")=="abc"); REQUIRE(osmscout::ReplaceString("abcabc", "a", "A")=="AbcAbc"); + REQUIRE(osmscout::ReplaceString("abcdef", "ef", "X")=="abcdX"); + REQUIRE(osmscout::ReplaceString("abcdef", "ab", "X")=="Xcdef"); } diff --git a/libosmscout/src/osmscout/util/String.cpp b/libosmscout/src/osmscout/util/String.cpp index b241e9946..42a34bdeb 100644 --- a/libosmscout/src/osmscout/util/String.cpp +++ b/libosmscout/src/osmscout/util/String.cpp @@ -432,16 +432,23 @@ namespace osmscout { if (search.empty()) { return in; } - auto arr=SplitString(in, search); - std::ostringstream buff; - for (auto it=arr.begin(); it!=arr.end();) { - buff << *it; - ++it; - if (it!=arr.end()) { - buff << replacement; + + std::ostringstream result; + std::string remaining=in; + + while (!remaining.empty()) { + std::string::size_type pos = remaining.find(search); + if (pos == std::string::npos) { + result << remaining; + break; + } else { + result << remaining.substr(0, pos); + result << replacement; + remaining.erase(0, pos + search.length()); } } - return buff.str(); + + return result.str(); } std::optional> SplitStringToPair(const std::string& str,