Skip to content

Commit 326479d

Browse files
authored
Escaped "-" in makeSafeForCharacterClass() (#11)
1 parent faadc02 commit 326479d

File tree

3 files changed

+36
-6
lines changed

3 files changed

+36
-6
lines changed

src/main/kotlin/RegexBuilder.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,8 +454,11 @@ class RegexBuilder {
454454
stringBuilder.append(quantifier?.toString() ?: "")
455455

456456
private fun makeSafeForCharacterClass(text: String): String {
457-
// Replace ] with \]
458-
var safeText = text.replace("]", "\\]")
457+
var safeText = text
458+
// Replace ] with \]
459+
.replace("]", "\\]")
460+
// Replace - with \-
461+
.replace("-", "\\-")
459462

460463
// replace ^ with \^ if it occurs at the start of the string
461464
if (safeText.startsWith("^")) {

src/test/kotlin/RegexBuilderDslTest.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.junit.Assert.assertNotNull
44
import org.junit.Assert.assertNull
55
import org.junit.Assert.assertTrue
66
import org.junit.Test
7+
import uk.co.mainwave.regextoolboxkotlin.RegexBuilder
78
import uk.co.mainwave.regextoolboxkotlin.RegexOptions.IGNORE_CASE
89
import uk.co.mainwave.regextoolboxkotlin.RegexOptions.MULTILINE
910
import uk.co.mainwave.regextoolboxkotlin.RegexQuantifier.AtLeast
@@ -1151,6 +1152,19 @@ class RegexBuilderDslTest {
11511152
assertTrue(regex.containsMatchIn(MAC_ADDRESS))
11521153
}
11531154

1155+
@Test
1156+
fun testAnyCharacterFromWithHyphen() {
1157+
val regex = regex {
1158+
anyCharacterFrom("a-f")
1159+
}
1160+
1161+
assertEquals("[a\\-f]", regex.toString())
1162+
assertTrue(regex.containsMatchIn("a"))
1163+
assertTrue(regex.containsMatchIn("-"))
1164+
assertTrue(regex.containsMatchIn("f"))
1165+
assertFalse(regex.containsMatchIn("c"))
1166+
}
1167+
11541168
@Test
11551169
fun testAnyCharacterFromWithCaretNotAtStart() {
11561170
val regex = regex {
@@ -2246,10 +2260,10 @@ class RegexBuilderDslTest {
22462260
text("s", ZeroOrOne)
22472261
text("://")
22482262
nonWhitespace(OneOrMore)
2249-
anyCharacterFrom("a-zA-Z0-9_/") // Valid last characters
2263+
anyCharacterFrom("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_/") // Valid last characters
22502264
}
22512265

2252-
assertEquals("http(?:s)?://\\S+[a-zA-Z0-9_/]", regex.toString())
2266+
assertEquals("http(?:s)?://\\S+[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_/]", regex.toString())
22532267
assertTrue(regex.containsMatchIn("http://www.mainwave.co.uk"))
22542268
assertTrue(regex.containsMatchIn("https://www.mainwave.co.uk"))
22552269
assertFalse(regex.containsMatchIn("www.mainwave.co.uk"))

src/test/kotlin/RegexBuilderTest.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,19 @@ class RegexBuilderTest {
11511151
assertTrue(regex.containsMatchIn(MAC_ADDRESS))
11521152
}
11531153

1154+
@Test
1155+
fun testAnyCharacterFromWithHyphen() {
1156+
val regex = RegexBuilder()
1157+
.anyCharacterFrom("a-f")
1158+
.buildRegex()
1159+
1160+
assertEquals("[a\\-f]", regex.toString())
1161+
assertTrue(regex.containsMatchIn("a"))
1162+
assertTrue(regex.containsMatchIn("-"))
1163+
assertTrue(regex.containsMatchIn("f"))
1164+
assertFalse(regex.containsMatchIn("c"))
1165+
}
1166+
11541167
@Test
11551168
fun testAnyCharacterFromWithCaretNotAtStart() {
11561169
val regex = RegexBuilder()
@@ -2246,10 +2259,10 @@ class RegexBuilderTest {
22462259
.text("s", ZeroOrOne)
22472260
.text("://")
22482261
.nonWhitespace(OneOrMore)
2249-
.anyCharacterFrom("a-zA-Z0-9_/") // Valid last characters
2262+
.anyCharacterFrom("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_/") // Valid last characters
22502263
.buildRegex()
22512264

2252-
assertEquals("http(?:s)?://\\S+[a-zA-Z0-9_/]", regex.toString())
2265+
assertEquals("http(?:s)?://\\S+[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_/]", regex.toString())
22532266
assertTrue(regex.containsMatchIn("http://www.mainwave.co.uk"))
22542267
assertTrue(regex.containsMatchIn("https://www.mainwave.co.uk"))
22552268
assertFalse(regex.containsMatchIn("www.mainwave.co.uk"))

0 commit comments

Comments
 (0)