[stdlib] Use Kotlin/JVM implementation for regex split (#2100)

This commit is contained in:
Ilya Matveev
2018-09-20 20:44:39 +03:00
committed by GitHub
parent 8213df8bf2
commit 9270b45fa5
4 changed files with 24 additions and 18 deletions
@@ -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)
+18 -14
View File
@@ -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. */