how to replace duplicated string using re{n,} in Kotlin?

Viewed 316

I want change "aaa" or "aa..." to "." using Regex(re{2,})

Below is my code

    var answer = "aaa"
    var re = Regex("re{2,}a") // Regex("are{2,}")
    answer = re.replace(answer,".")
    println(answer)

Regex("re{2,}a") and Regex("are{2,}")

Both println aaa

How can I replace duplicated string using re{n,} ??

2 Answers
fun main(args: Array<String>) {
    var tests = arrayOf("a","aa","aaa","aaaa")
    val re = Regex("a(a+)")
    tests.forEach {t->
        val result = re.replace(t,".")
        println(result)
    }
}

output:

a . . .

Generic regex to replace any duplicates (not only duplicate a symbols) is (?<symbol>.)\k<symbol>+

You may define an extension function for convenient usage:

private val duplicateRegex = "(?<symbol>.)\\k<symbol>+".toRegex()
fun String.replaceDuplicatesWith(replacement: String): String = replace(duplicateRegex, replacement)

Usage:

println("a".replaceDuplicatesWith("."))     //a
println("aaa".replaceDuplicatesWith("."))   //.
println("aa...".replaceDuplicatesWith(".")) //..

If you want duplicates to be iteratively replaced (like "aa..." -> ".." -> ".") you'll need an auxilary recursive method:

tailrec fun String.iterativelyReplaceDuplicatesWith(replacement: String): String {
    val result = this.replaceDuplicatesWith(replacement)
    return if (result == this) result else result.iterativelyReplaceDuplicatesWith(replacement)
}

Usage:

println("a".iterativelyReplaceDuplicatesWith("."))     //a
println("aaa".iterativelyReplaceDuplicatesWith("."))   //.
println("aa...".iterativelyReplaceDuplicatesWith(".")) //.
Related