我目前在尝试搜索和替换字符串时在android应用中遇到问题。

我收到一个包含关键字${keyword}的句子,就像Today we are ${keyword} and it is beautiful一样,我必须解析它并用特定字符串替换${keyword}
下面是我的代码:

const val PATTERN_TO_FIND = "\${keyword}"

private val keywordRegex = Regex(ContentfulTranslations.PATTERN_TO_FIND)

fun replaceMyKeyword(sentence: String): String{
    return sentence.replace(keywordRegex, "blabla")
}

解析句子并查找模式时,应用程序不断崩溃。

我已经使用了这种方法,它曾经可以工作,但是要查找的模式未格式化为${keyword}
任何的想法?

谢谢

最佳答案

它崩溃的原因是大括号是regexp中的保留字符,表示一个范围,因此您需要对它们进行转义(或至少是开头的转义)。
此外,\$会在正则表达式的开头放置一个文字$符号,但是美元符号表示要匹配的字符串的末尾,因此您也需要“regexp-escape”。最终结果将是:

const val PATTERN_TO_FIND = "\\\$\\{keyword}"

幸运的是,Pattern类提供了一种实用程序方法来自动转义正则表达式:
val pattern = Pattern.quote("\${keyword}")

请注意,您仍然需要转义美元符号,因为它在Kotlin中具有特殊含义。

一个完整的工作示例:
fun main() {
    val s = "Today we are \${keyword} and it is beautiful"

    val pattern = Pattern.quote("\${keyword}")
    val keywordRegex = Regex(pattern)

    println(s.replace(keywordRegex, "blabla"))
}

将打印:
Today we are blabla and it is beautiful

10-04 10:33
查看更多