Как использовать обратные ссылки в регулярных выражениях kotlin? - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь использовать регулярное выражение с обратными ссылками в kotlin для замены заполнителей строки следующим образом:

Источник: "Это% s с% 02d независимо от того,"

Цель:" Это с <02d /> безотносительно "

Так что я ищу что-то подобное, но с правильным синтаксисом, конечно:

private fun escapePlaceHolders(text: String): String {
    return """%([^ ]+?)""".toRegex().replace(text, "<\1/>")
}

Очевидно, что этот код даже не компилируется, не говоря уже о работе.Проблема в том, что я не знаю, как использовать обратную ссылку в функции замены, если это вообще возможно.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Самый простой способ сделать это - то, что Wiktor Stribiżew описал в принятом ответе .

Существует мощная альтернатива в случае, если вам нужно не просто ссылаться, а произвольно преобразовывать совпадения для замены.replace перегрузка с подписью:

fun CharSequence.replace(regex: Regex, transform: (<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-match-result/index.html" rel="nofollow noreferrer">MatchResult</a>) -> CharSequence): String

Может использоваться следующим образом:

"""%([^ ]+)""".toRegex().replace(text) { "<${it.groupValues[1]}/>" }
0 голосов
/ 17 октября 2018

Вы можете использовать

val text = "This is a %s with %02d whatever"
val rx = """%(\d*[a-z])""".toRegex()
println(text.replace(rx, "<$1/>")) // => This is a <s/> with <02d/> whatever

См. Демоверсию Kotlin

Подробности

  • %- a % char
  • (\d*[a-z]) - Группа 1 (позднее обозначается $1 из шаблона замены):
    • \d* - 0+ цифр
    • [a-z] - строчная буква ASCII.

Не стесняйтесь настроить шаблон для вашего ввода, идея остается той же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...