Замена строки Android с использованием шаблона - PullRequest
1 голос
/ 24 мая 2019

В настоящее время я сталкиваюсь с проблемой в моем приложении для 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}

Есть идеи?

Спасибо

1 Ответ

2 голосов
/ 24 мая 2019

Причиной сбоя является то, что фигурные скобки являются зарезервированными символами в регулярном выражении, указывающем диапазон, поэтому вам нужно экранировать их (или, по крайней мере, открывающую). Более того, \$ будет помещать буквальный знак $ в начале вашего регулярного выражения, но знак доллара указывает конец строки для сопоставления, так что вам также нужно "regexp-escape". Конечный результат будет быть:

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

К счастью, Pattern класс предлагает служебный метод для автоматического экранирования регулярного выражения:

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

Обратите внимание, что вам все еще нужно избегать знака доллара, потому что он имеет особое значение в котлине.

Полный рабочий пример:

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
...