Revert using regex Pattern in String.replace
Use String.indexOf(..., ignoreCase) instead in all branches to preserve compatibility with behavior before 1.4.20 that used String.split which essentially relied on that String.indexOf #KT-43745 Fixed
This commit is contained in:
@@ -77,17 +77,7 @@ public actual fun String.replace(oldChar: Char, newChar: Char, ignoreCase: Boole
|
|||||||
*/
|
*/
|
||||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||||
public actual fun String.replace(oldValue: String, newValue: String, ignoreCase: Boolean = false): String {
|
public actual fun String.replace(oldValue: String, newValue: String, ignoreCase: Boolean = false): String {
|
||||||
if (ignoreCase) {
|
run {
|
||||||
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 {
|
|
||||||
var occurrenceIndex: Int = indexOf(oldValue, 0, ignoreCase)
|
var occurrenceIndex: Int = indexOf(oldValue, 0, ignoreCase)
|
||||||
// FAST PATH: no match
|
// FAST PATH: no match
|
||||||
if (occurrenceIndex < 0) return this
|
if (occurrenceIndex < 0) return this
|
||||||
|
|||||||
@@ -896,6 +896,22 @@ class StringTest {
|
|||||||
|
|
||||||
assertEquals("-a-b-b-A-b-", input.replace("", "-"))
|
assertEquals("-a-b-b-A-b-", input.replace("", "-"))
|
||||||
assertEquals("-a-b-b-A-b-", input.replace("", "-", ignoreCase = true))
|
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() {
|
@Test fun replaceFirst() {
|
||||||
|
|||||||
Reference in New Issue
Block a user