通过正则表达式模式查找索引位置,并将其替换为Scala中的索引列表

时间:2018-12-18 13:28:34

标签: regex scala immutability

我有以下格式的字符串: object[i].base.base_x[i],我得到类似List(0,1)的列表。 我想在scala中使用正则表达式在给定的字符串中找到匹配项[i],然后将第一个匹配项替换为0,将第二个匹配项替换为1,因此得到类似object[0].base.base_x[1]的内容。

我有以下代码:

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 :(得分:0)

如何?

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]

答案 1 :(得分:0)

这听起来像foldLeft的工作。无需进行if (indexValues.nonEmpty)检查。

indexValues.foldLeft(stringWithoutIndex) { (s, row) =>
  indexReplacePattern.replaceFirstIn(s, "[" + row + "]")
}

答案 2 :(得分:0)

您可以使用foldLeft遍历indexValues中的整数,并将字符串stringWithoutIndex用作起始值。

然后使用replaceFirst将第一个匹配项替换为indexValues的当前值。

如果要使用正则表达式,可以使用正数lookahead (?=])和正斜视(?<=\[)后断言i在尖括号和方括号之间。

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

例如:

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

请参见regex demo | Scala demo