从字符串列表中删除字符

4

我使用以下代码从字符串列表中删除字符:

val validLines : List[String] = List("test[" , "test]")

    val charsToClean: List[String] = List("\"", "[", "]", "'")

    val filtered = validLines.map(line => line.replace(charsToClean(0), "")
      .replace(charsToClean(1), "")
      .replace(charsToClean(2), "")
      .replace(charsToClean(3), ""))

我正在尝试使用内部映射函数代替硬编码字符替换的位置:
val filtered1 : List[String] = validLines.map(line => charsToClean.map {c => line.replace(c , "")  })

但是收到编译器错误:
mismatch; found : List[List[String]] required: List[String]
< p> line.replace(c, "") 的结果是否不应返回?
4个回答

8
不行,因为你的代码更像是:对于每个字符串和每个不需要的字符,返回该符号的替换(n^2个字符串)。
你可能想要实现的功能可以通过以下代码片段来实现:
val rawLines : List[String] = List("test[" , "test]")
val blacklist: Set[Char] = Set('\"', '[', ']' ,''')
rawLines.map(line => line.filterNot(c => blacklist.contains(c)))
// res2: List[String] = List(test, test)

或者,可以像 @ka4eli 在他的回答中展示的那样,使用正则表达式来处理。

谢谢,如果我使用List[String]代替Set[Char]来包含黑名单项,那么这些项就不会被过滤吗? - blue-sky
1
@blue-sky,你可以使用List[Char],但不能使用List[String] - ka4eli
@ka4eli为什么?包含方法在处理字符串列表或字符集时应该表现一致,不是吗? - blue-sky
1
当您在String上进行过滤时,当前的迭代器类型为Char - ka4eli

4

replaceAll 可以包含更复杂的正则表达式,使用 |(或)运算符构建:

validLines.map(_.replaceAll("\\[|\\]|'|\"", ""))

3
你需要使用 foldLeft 而不是 map
val validLines : List[String] = List("test[" , "test]")

val charsToClean: List[String] = List("\"", "[", "]", "'")

val filtered : List[String] = validLines.map(line => charsToClean.foldLeft(line)(_.replace(_, "")))

1

使用 for 推导式语法与 @om-nom-nom 等效;给定一组要删除的字符,

val charsToClean = """"[]'""".toSet

然后

for (l <- validLines) yield l.filterNot(charsToClean)

filterNot中应用了隐式集合包含Char => Boolean函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接