diff --git a/libraries/stdlib/jvm/src/kotlin/text/StringsJVM.kt b/libraries/stdlib/jvm/src/kotlin/text/StringsJVM.kt index e1e6cc947cc..e90a0146368 100644 --- a/libraries/stdlib/jvm/src/kotlin/text/StringsJVM.kt +++ b/libraries/stdlib/jvm/src/kotlin/text/StringsJVM.kt @@ -77,17 +77,7 @@ public actual fun String.replace(oldChar: Char, newChar: Char, ignoreCase: Boole */ @Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS") public actual fun String.replace(oldValue: String, newValue: String, ignoreCase: Boolean = false): String { - if (ignoreCase) { - val matcher = Pattern.compile(oldValue, Pattern.LITERAL or Pattern.CASE_INSENSITIVE).matcher(this) - if (!matcher.find()) return this - val stringBuilder = StringBuilder() - var i = 0 - do { - stringBuilder.append(this, i, matcher.start()).append(newValue) - i = matcher.end() - } while (matcher.find()) - return stringBuilder.append(this, i, length).toString() - } else { + run { var occurrenceIndex: Int = indexOf(oldValue, 0, ignoreCase) // FAST PATH: no match if (occurrenceIndex < 0) return this diff --git a/libraries/stdlib/test/text/StringTest.kt b/libraries/stdlib/test/text/StringTest.kt index c57555b06c6..9046fb492b5 100644 --- a/libraries/stdlib/test/text/StringTest.kt +++ b/libraries/stdlib/test/text/StringTest.kt @@ -896,6 +896,22 @@ class StringTest { assertEquals("-a-b-b-A-b-", input.replace("", "-")) assertEquals("-a-b-b-A-b-", input.replace("", "-", ignoreCase = true)) + + fun testIgnoreCase(chars: String) { + for ((i, c) in chars.withIndex()) { + val message = "Char: $c (${c.toInt()})" + val expectOneReplaced = chars.replaceRange(i..i, "_") + val expectAllReplaced = "_".repeat(chars.length) + assertEquals(expectOneReplaced, chars.replace(c, '_'), message) + assertEquals(expectAllReplaced, chars.replace(c, '_', ignoreCase = true), "$message, ignoreCase") + assertEquals(expectOneReplaced, chars.replace(c.toString(), "_"), "$message, as string") + assertEquals(expectAllReplaced, chars.replace(c.toString(), "_", ignoreCase = true), "$message, as string, ignoreCase") + } + } + + testIgnoreCase("üÜ") + testIgnoreCase("öÖ") + testIgnoreCase("äÄ") } @Test fun replaceFirst() {