Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何将一个字符串与另一个之间有空格的字符串进行比较_Regex_Scala_String Comparison - Fatal编程技术网

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

Regex 如何将一个字符串与另一个之间有空格的字符串进行比较,regex,scala,string-comparison,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" 另一个例子 val a = "go pro hero 6" val b = "gopro" val a = "hero go pr

如何比较这两个字符串:

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"
另一个例子

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"
另一个例子

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"
对于上述比较,我想得到“真”,但不是这里:

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
}
这适用于最后一种情况,但不适用于其他情况


有什么建议吗?

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


下面是一种使用滑动(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

我认为这是解决你问题的办法

def matchPattern(a: String, b: String): Boolean =
  a
    .split("\\s+")
    .tails
    .flatMap(_.inits)
    .exists(_.mkString("") == b)
这将检查
a
中是否有与
b
中的单词完全匹配的单词或单词序列。它将拒绝
b
嵌入较长单词或单词序列的情况

split
调用将字符串转换为单词列表

tails
调用返回列表中所有可能的尾随子序列,
inits
返回所有前导子序列。将这两个子序列结合起来,将生成原始列表中所有可能的子序列

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



请注意,
tails
inits
是惰性的,因此它们将依次生成要测试的每个解决方案,并在找到解决方案后立即停止。这与使用
滑动
的解决方案不同,滑动在检查它们之前创建所有可能的组合。

这里有一种使用
for/yield这与@leo-c方法类似。使用
for
单词
生成长度为
i
的滑动窗口,以返回原始单词和组合

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=“foo-gopro-bar”val b=“gopro”
val a=“foo-go-pro-hero-bar”val b=“goprohero
呢?是的。。所有这些都应该返回true
\bf\s*i\s*t\s*b\s*i\s*t\b
\bg\s*o\s*p\s*r\s*o\b
\bv\s*e\s*g\s*a\b
,其中正则表达式不区分大小写。@sln我认为OP是在寻找一个通用函数
匹配模式
,而不是这个特殊情况下的一些正则表达式。如果OP能更清楚地解释测试规则就好了。@Tim-显然,正则表达式是通过在每个字符之间放置
\s*
并以
\b
结尾生成的。