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