scala 使用Map of replacements替换字符串上的多个单词

yhuiod9q  于 4个月前  发布在  Scala
关注(0)|答案(3)|浏览(66)

我有一张替换的Map
第一个月
我想用对应的值替换字符串中每个Map键的所有出现。

val str = "This aaa is very bbb and I would love to cccc"
val result = cleanString(str, replacements)
result = "This d is very x and I would love to mx"

字符串
我所做

val sb = new StringBuilder(str)
for(repl <- replacements.keySet) yield {
  sb.replaceAllLiterally(repl, replacement.get(repl))
}


但我更喜欢像mapfold这样的函数,其中我应用于字符串的函数返回另一个字符串,而不需要在循环中修改的可变变量。

ttcibm8c

ttcibm8c1#

一个选项:在Map上使用foldLeft,并将str作为初始参数:

replacements.foldLeft(str)((a, b) => a.replaceAllLiterally(b._1, b._2))
// res8: String = This d is very x and I would love to mxc

字符串

nom7f22z

nom7f22z2#

我不太喜欢这个,但它应该工作:

str.split(" ").toList.map { s => 
  if(replacements.get(s).isDefined) { 
    replacements(s) 
  } else { 
    s  
  } 
}.mkString(" ")

字符串

mtb9vblg

mtb9vblg3#

你可以用正则表达式来实现,但是要注意顺序。

val str = "aaaaaa"
val relaceMap = Map("aaaaa" -> "C", "a" -> "A", "aaa" -> "B")
val pattern = relaceMap.keys.mkString("|").r
val result = pattern.replaceAllIn(str, m => relaceMap(m.matched)) // CA

字符串

相关问题