Найдите расположение индексов по шаблону регулярных выражений и замените их списком индексов в Scala - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть строки в этом формате: object[i].base.base_x[i], и я получаю списки типа List(0,1).Я хочу использовать регулярные выражения в scala, чтобы найти совпадение [i] в данной строке и заменить первое вхождение на 0, а второе на 1. Следовательно, получая что-то вроде object[0].base.base_x[1].

. У меня есть следующееcode:

val stringWithoutIndex = "object[i].base.base_x[i]"     // basically this string is generated dynamically
val indexReplacePattern = raw"\[i\]".r
val indexValues = List(0,1)     // list generated dynamically

if(indexValues.nonEmpty){ 
    indexValues.map(row => {
       indexReplacePattern.replaceFirstIn(stringWithoutIndex ,  "[" + row + "]")
     }) 
else stringWithoutIndex

Так как String является неизменяемым, я не могу обновить stringWithoutIndex, в результате чего получается вывод, такой как List("object[0].base.base_x[i]", "object[1].base.base_x[i]").

Я попытался просмотреть StringBuilder, но я не уверен, как обновитьЭто.Кроме того, есть ли лучший способ сделать это?Также приветствуются предложения, отличные от регулярных выражений.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Это звучит как работа для foldLeft.Нет необходимости в проверке if (indexValues.nonEmpty).

indexValues.foldLeft(stringWithoutIndex) { (s, row) =>
  indexReplacePattern.replaceFirstIn(s, "[" + row + "]")
}
0 голосов
/ 18 декабря 2018

Вы можете пролистать целые числа в indexValues, используя foldLeft и передать строку stringWithoutIndex в качестве начального значения.

Затем используйте replaceFirst, чтобы заменить первое совпадение текущим значением indexValues.

Если вы хотите использовать регулярное выражение, вы можете использовать положительный lookahead (?=]) и положительный lookbehind (?<=\[), чтобы утверждать, что i находится между открывающими и квадратными скобками.

(?<=\[)i(?=])

Например:

val strRegex = """(?<=\[)i(?=])"""
val res = indexValues.foldLeft(stringWithoutIndex) { (s, row) =>
  s.replaceFirst(strRegex, row.toString)
}

См. Демонстрационную версию regex | Scala demo

0 голосов
/ 18 декабря 2018

Как насчет этого:

scala> val str = "object[i].base.base_x[i]" 
str: String = object[i].base.base_x[i]

scala> str.replace('i', '0').replace("base_x[0]", "base_x[1]")
res0: String = object[0].base.base_x[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...