我有一个关于Scala部分字符串匹配的快速问题。考虑一下这个例子:
val s1 = "game of thrones"
val s2 = Array("thrones videos", "watch game", "game of thrones stuff")
我想做某种正则表达式或匹配或contains
这样结果应该是这样的:
Array("videos", "watch", "stuff")
删除s1
中重复的字符串中的任何单词。什么是最有效的方式?
我目前正在通过将s1
转换为正则表达式并将其应用于s2
的每一行来实现此目的,但我也无法将其运行。
答案 0 :(得分:3)
使用split
,contains
,map
和filter
可以实现这一点。关键是首先使用split
:
val s1Words = s1.split(" ")
现在,对于s2
中的每个字符串,您希望同样使用split
,过滤掉s1Words
中出现的字词,然后将其转换回字符串:
s2.map(_.split(" ").filterNot(s1Words.contains).mkString(" "))
您也可以将s1Words
转换为一个集合,然后使用apply
上的Set
方法来测试包含:
val s1Words = s1.split(" ").toSet
s2.map(_.split(" ").filterNot(s1Words).mkString(" "))
如果s2
中的单词是由空格以外的一组字符分隔,您可能更喜欢使用正则表达式,以便您可以捕获分隔符,然后在调用mkString
时替换它。
答案 1 :(得分:2)
不确定是最有效的'这样做的方式(取决于你的效率),但我们走了:
val ss1 = s1.split("\\s").toSet //make a set of the words you have
//ss1: Array[String] = Array(game, of, thrones)
val ss2 = s2.map(_.split("\\s").toSet -- ss1).flatten //make a set of words and remove the ones in ss1
// Array[String] = Array(throne, videos, watch, stuff)