我有以下格式的字符串:
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,但不确定如何更新它。另外,还有更好的方法吗?除正则表达式外,也欢迎提出其他建议。
答案 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