如何比较一个字符串与另一个之间有空格的字符串

时间:2019-01-07 22:48:26

标签: regex scala string-comparison

如何比较这两个字符串:

val a = "fit bit versa"
val b = "fitbit"

另一个例子

val a = "go pro hero 6"
val b = "gopro"

另一个例子

val a = "hero go pro  6"
val b = "gopro"

另一个例子

val a = "hero 6 go pro"
val b = "gopro"

对于以上比较,我想获得“ true”,但在这里不是:

val a = "vegan protein powder"
val b = "vega"

这应该是错误的。

我目前正在做

def matchPattern(a:String, b: String):String=
{
      val dd = a.split(" ")
      val result = dd.map(_.toLowerCase())
      if(result contains b.toLowerCase) true 
      else false
}

这适用于最后一种情况,但不适用于其他情况。

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

这是使用sliding(i)的一种方法,其中i的范围是2到a中的单词数,以组合所有可能并置的相邻单词的列表。然后检查以查看b是否与列表中的任何元素完全匹配,如下所示:

def matchPattern(a: String, b: String): Boolean = {
  val words = a.toLowerCase.split("\\s+")

  val concats = (2 to words.size).foldLeft(words)(
    (acc, i) => acc ++ words.sliding(i).map(_.mkString)
  )

  concats contains b.toLowerCase
}

matchPattern("Hero go Pro 6", "gopro")
// res1: Boolean = true

matchPattern("Hero go Pro 6", "gopro6")
// res2: Boolean = true

matchPattern("Vegan protein powder", "vega")
// res3: Boolean = false

答案 1 :(得分:0)

我认为这是解决您问题的方法。

def matchPattern(a: String, b: String): Boolean =
  a
    .split("\\s+")
    .tails
    .flatMap(_.inits)
    .exists(_.mkString("") == b)

这将检查a中与b中的单词完全匹配的任何单词或单词序列。它将拒绝将b嵌入较长的单词或单词序列中的情况。

split调用将字符串变成单词列表。

tails调用返回列表的所有可能的尾随子序列,而inits返回所有开头的子序列。将两者结合起来会生成原始列表的所有可能子序列。

exist调用将单词连接在一起,并将它们与测试单词进行比较。


请注意,tailsinits是惰性的,因此它们将依次生成每个要测试的解决方案,并在找到解决方案后立即停止。这与使用sliding的解决方案形成对比,该解决方案在检查任何组合之前都会创建每种可能的组合。

答案 2 :(得分:0)

这是使用for/yield的方法,结果与@ leo-c方法类似。 for用于从i生成长度为words的滑动窗口,以返回原始单词和组合。

def matchPattern(a:String, b: String): Boolean =  {
  val words = a.split(" ")

  val combinations = words ++ (for(
    i <- (2 to words.size);
    acc <- words.sliding(i)
  ) yield acc).map(_.mkString)

  combinations.contains(b)
} 

测试用例:

val a = "fit bit versa"
val b = "fitbit"

val c = "go pro hero 6"
val d = "gopro"

val e = "hero go pro  6"  
val f = "gopro"

//false
val g = "vegan protein powder"
val h = "vega"

val i = "foo gopro bar"
val j = "gopro"

val k = "foo go pro hero bar"
val l = "goprohero"

scala> matchPattern(a,b) && matchPattern(c,d) && matchPattern(e,f) &&  !matchPattern(g,h) && matchPattern(i,j) && matchPattern(k,l) 

res175: Boolean = true

答案 3 :(得分:-1)

我猜是这样的(您的要求是不完整的,所以我将它们解释为“完全匹配给定字符串的开头部分,以空格或行尾结尾,也许除了空格)。

  @tailrec
  def matchWords(input: Seq[Char], words: Seq[Char]): Boolean = (input, words) match {
     case (Seq(), Seq() | Seq(' ', _*)) => true
     case (Seq(), _) => false
     case (Seq(a, tail@_*), Seq(b, rest@_*)) if a == b => matchWords(tail, rest)
     case (_, Seq(' ', rest@_*)) => matchWords(input, rest)
     case _ => false
   }