[stdlib] Use Kotlin/JVM implementation for regex split (#2100)
This commit is contained in:
@@ -407,8 +407,9 @@ class MatchResultTest {
|
|||||||
val regex = Regex("")
|
val regex = Regex("")
|
||||||
val s = regex.split("", 0)
|
val s = regex.split("", 0)
|
||||||
|
|
||||||
assertEquals(1, s.size)
|
assertEquals(2, s.size)
|
||||||
assertEquals("", s[0])
|
assertEquals("", s[0])
|
||||||
|
assertEquals("", s[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test fun testFindDollar() {
|
@Test fun testFindDollar() {
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ class PatternTest {
|
|||||||
assertEquals(s.size, 1)
|
assertEquals(s.size, 1)
|
||||||
regex = Regex("")
|
regex = Regex("")
|
||||||
s = regex.split("", 0)
|
s = regex.split("", 0)
|
||||||
assertEquals(s.size, 1)
|
assertEquals(s.size, 2)
|
||||||
s = regex.split("abccbadfe", 0)
|
s = regex.split("abccbadfe", 0)
|
||||||
assertEquals(s.size, 11)
|
assertEquals(s.size, 11)
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ class PatternTest {
|
|||||||
assertEquals(s.size, 1)
|
assertEquals(s.size, 1)
|
||||||
regex = Regex("")
|
regex = Regex("")
|
||||||
s = regex.split("", 11)
|
s = regex.split("", 11)
|
||||||
assertEquals(s.size, 1)
|
assertEquals(s.size, 2)
|
||||||
s = regex.split("abccbadfe", 15)
|
s = regex.split("abccbadfe", 15)
|
||||||
assertEquals(s.size, 11)
|
assertEquals(s.size, 11)
|
||||||
|
|
||||||
|
|||||||
@@ -122,8 +122,9 @@ class SplitTest {
|
|||||||
assertEquals("", s[2])
|
assertEquals("", s[2])
|
||||||
|
|
||||||
s = p.split("", 0)
|
s = p.split("", 0)
|
||||||
assertEquals(1, s.size)
|
assertEquals(2, s.size)
|
||||||
assertEquals("", s[0])
|
assertEquals("", s[0])
|
||||||
|
assertEquals("", s[1])
|
||||||
|
|
||||||
s = p.split("abcd", 0)
|
s = p.split("abcd", 0)
|
||||||
assertEquals(6, s.size)
|
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> {
|
actual fun split(input: CharSequence, limit: Int): List<String> {
|
||||||
require(limit >= 0, { "Limit must be non-negative, but was $limit." } )
|
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)) {
|
var match: MatchResult? = find(input)
|
||||||
result.add(input.substring(lastStart, match.range.start))
|
|
||||||
lastStart = match.range.endInclusive + 1
|
if (match == null || limit == 1) return listOf(input.toString())
|
||||||
match = match.next()
|
|
||||||
}
|
val result = ArrayList<String>(if (limit > 0) limit.coerceAtMost(10) else 10)
|
||||||
result.add(input.substring(lastStart, input.length))
|
var lastStart = 0
|
||||||
return result
|
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. */
|
/** Returns the string representation of this regular expression, namely the [pattern] of this regular expression. */
|
||||||
|
|||||||
Reference in New Issue
Block a user