diff --git a/backend.native/tests/harmony_regex/MatchResultTest.kt b/backend.native/tests/harmony_regex/MatchResultTest.kt index 3ee6763f928..7c3bf53cde0 100644 --- a/backend.native/tests/harmony_regex/MatchResultTest.kt +++ b/backend.native/tests/harmony_regex/MatchResultTest.kt @@ -407,8 +407,9 @@ class MatchResultTest { val regex = Regex("") val s = regex.split("", 0) - assertEquals(1, s.size) + assertEquals(2, s.size) assertEquals("", s[0]) + assertEquals("", s[1]) } @Test fun testFindDollar() { diff --git a/backend.native/tests/harmony_regex/PatternTest.kt b/backend.native/tests/harmony_regex/PatternTest.kt index 701bb7452ab..121a43875d5 100644 --- a/backend.native/tests/harmony_regex/PatternTest.kt +++ b/backend.native/tests/harmony_regex/PatternTest.kt @@ -57,7 +57,7 @@ class PatternTest { assertEquals(s.size, 1) regex = Regex("") s = regex.split("", 0) - assertEquals(s.size, 1) + assertEquals(s.size, 2) s = regex.split("abccbadfe", 0) assertEquals(s.size, 11) @@ -69,7 +69,7 @@ class PatternTest { assertEquals(s.size, 1) regex = Regex("") s = regex.split("", 11) - assertEquals(s.size, 1) + assertEquals(s.size, 2) s = regex.split("abccbadfe", 15) assertEquals(s.size, 11) diff --git a/backend.native/tests/harmony_regex/SplitTest.kt b/backend.native/tests/harmony_regex/SplitTest.kt index 7b4be3d57c3..932fdb956d3 100644 --- a/backend.native/tests/harmony_regex/SplitTest.kt +++ b/backend.native/tests/harmony_regex/SplitTest.kt @@ -122,8 +122,9 @@ class SplitTest { assertEquals("", s[2]) s = p.split("", 0) - assertEquals(1, s.size) + assertEquals(2, s.size) assertEquals("", s[0]) + assertEquals("", s[1]) s = p.split("abcd", 0) assertEquals(6, s.size) diff --git a/runtime/src/main/kotlin/kotlin/text/Regex.kt b/runtime/src/main/kotlin/kotlin/text/Regex.kt index 91da9e64903..e20d5618cf6 100644 --- a/runtime/src/main/kotlin/kotlin/text/Regex.kt +++ b/runtime/src/main/kotlin/kotlin/text/Regex.kt @@ -261,21 +261,25 @@ actual public class Regex internal constructor(internal val nativePattern: Patte */ actual fun split(input: CharSequence, limit: Int): List { require(limit >= 0, { "Limit must be non-negative, but was $limit." } ) - if (input.isEmpty()) { - return listOf("") - } else { - var lastStart = 0 - val result = mutableListOf() - var match: MatchResult? = find(input) - while (match != null && (limit == 0 || result.size < limit - 1)) { - result.add(input.substring(lastStart, match.range.start)) - lastStart = match.range.endInclusive + 1 - match = match.next() - } - result.add(input.substring(lastStart, input.length)) - return result - } + var match: MatchResult? = find(input) + + if (match == null || limit == 1) return listOf(input.toString()) + + val result = ArrayList(if (limit > 0) limit.coerceAtMost(10) else 10) + var lastStart = 0 + val lastSplit = limit - 1 // negative if there's no limit + + do { + result.add(input.substring(lastStart, match!!.range.start)) + lastStart = match.range.endInclusive + 1 + if (lastSplit >= 0 && result.size == lastSplit) break + match = match.next() + } while (match != null) + + result.add(input.substring(lastStart, input.length)) + + return result } /** Returns the string representation of this regular expression, namely the [pattern] of this regular expression. */