[stdlib] Use Kotlin/JVM implementation for regex split (#2100)
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -261,21 +261,25 @@ actual public class Regex internal constructor(internal val nativePattern: Patte
|
||||
*/
|
||||
actual fun split(input: CharSequence, limit: Int): List<String> {
|
||||
require(limit >= 0, { "Limit must be non-negative, but was $limit." } )
|
||||
if (input.isEmpty()) {
|
||||
return listOf("")
|
||||
} else {
|
||||
var lastStart = 0
|
||||
val result = mutableListOf<String>()
|
||||
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<String>(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. */
|
||||
|
||||
Reference in New Issue
Block a user