From aa6bdb039bdf2a919931291b17f51718232d7c91 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Thu, 23 Apr 2015 18:04:50 +0300 Subject: [PATCH] Take caution when advancing to the next match after an empty string was matched not to stuck at the same position. --- js/js.libraries/src/core/regex.kt | 2 +- libraries/stdlib/src/kotlin/text/regex/RegexJVM.kt | 2 +- libraries/stdlib/test/text/RegexTest.kt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/js.libraries/src/core/regex.kt b/js/js.libraries/src/core/regex.kt index 930f48e2554..2ba2504b3a3 100644 --- a/js/js.libraries/src/core/regex.kt +++ b/js/js.libraries/src/core/regex.kt @@ -188,6 +188,6 @@ private fun RegExp.findNext(input: String, from: Int): MatchResult? { override fun get(index: Int): MatchGroup? = match[index]?.let { MatchGroup(it) } } - override fun next(): MatchResult? = this@findNext.findNext(input, range.end + 1) + override fun next(): MatchResult? = this@findNext.findNext(input, if (range.isEmpty()) range.start + 1 else range.end + 1) } } \ No newline at end of file diff --git a/libraries/stdlib/src/kotlin/text/regex/RegexJVM.kt b/libraries/stdlib/src/kotlin/text/regex/RegexJVM.kt index 81ceebeacec..f0edff887ee 100644 --- a/libraries/stdlib/src/kotlin/text/regex/RegexJVM.kt +++ b/libraries/stdlib/src/kotlin/text/regex/RegexJVM.kt @@ -244,7 +244,7 @@ private fun Matcher.findNext(from: Int): MatchResult? { } - override fun next(): MatchResult? = this@findNext.findNext(matchResult.end()) + override fun next(): MatchResult? = this@findNext.findNext(matchResult.end() + if (matchResult.end() == matchResult.start()) 1 else 0) } } diff --git a/libraries/stdlib/test/text/RegexTest.kt b/libraries/stdlib/test/text/RegexTest.kt index 02dbb06c07b..076689dba37 100644 --- a/libraries/stdlib/test/text/RegexTest.kt +++ b/libraries/stdlib/test/text/RegexTest.kt @@ -86,8 +86,8 @@ class RegexTest { test fun matchMultiline() { val regex = "^[a-z]*$".toRegex(setOf(RegexOption.IGNORE_CASE, RegexOption.MULTILINE)) - val matchedValues = regex.matchAll("test\r\nLine").map { it.value }.toList() - assertEquals(listOf("test", "Line"), matchedValues) + val matchedValues = regex.matchAll("test\n\nLine").map { it.value }.toList() + assertEquals(listOf("test", "", "Line"), matchedValues) } test fun escapeLiteral() {