我是Scala的初学者,我想知道如何构建一个函数来检查它是否与确定的模式匹配?
例如:
def patternFound(s:String): Boolean = (s) match {
case s matches xyxy pattern => true //where x,y are two consecutive characters in the string
case s matches xxyy pattern => false //where x, y are two characters in that string
case (_) => false //default
}
//Here x,y are not definite characters but the string s should match a pattern
//which consist a string of pattern containing characters in alternating positions
patternFound("babab")//true because pattern of xyxy found in it
patternFound("baabba")//false because pattern of xxyy found in it
任何人都可以通过示例展示我如何实现这一目标吗?
寻找一个解决方案,该解决方案在字符串中出现任何xyxyxy模式时返回true,但在该字符串中模式为xxyy时返回false。
示例:如果字符串为" babab"该函数应返回true。要么 "巴" (其中包含模式xyxy),但对于" aabba"返回false。 或" bbaab" (其中包含xxyy模式)
任何帮助表示赞赏!提前谢谢。
答案 0 :(得分:0)
语法不正确。 你需要从函数体中删除“s matches”,它已经在方法定义行“(s)match”中。
答案 1 :(得分:0)
这可能是正则表达式和环顾四周,但我刚刚创建了一个辅助函数:
/**
* Checks for recurring pattern in a String
* @param s The input String to check
* @param patternSize The size of the expected pattern. For example in the String "aabbaabbaabb" the pattern is "aabb" which is a length of 4
*/
def checkPattern(s: String, patternSize: Int): Boolean = {
val grouped = s.grouped(patternSize)
grouped.toSet.size == 1 // everything should be the same
}
该功能的一些示例用法:
checkPattern("abababab", 2) // true
checkPattern("aabbaabbaabb", 2) // false
checkPattern("aabbaabbaabb", 4) // true
checkPattern("abcabcabc", 3) // true
因此,对于您的代码,您可以将它与一些保护语句一起使用:
def patternFound(s: String): Boolean = s match {
case "" => false // empty Strings can't have patterns
case s if checkPattern(s, 2) => true
case s if checkPattern(s, 4) => true
case _ => false
}
patternFound("ababababab") // true
patternFound("aabbaabb") // true
patternFound("aabbzz") // false
编辑:我认为另一个答案更适合您所寻找的内容,但这里是我更新后的最新答案:
def patternFound(s: String): Boolean = s match {
s.nonEmpty && checkPattern(s, 2)
}
答案 2 :(得分:0)
对于您发布的两个示例,这两个正则表达式模式将覆盖它。
def patternFound(s:String): Boolean = {
val ptrn1 = "(.)(.)\\1\\2".r
val ptrn2 = "(.)\\1(.)\\2".r
s match {
case ptrn1(_,_) => true
case ptrn2(_,_) => true
case _ => false
}
}
证明:
patternFound("rrgg") // res0: Boolean = true
patternFound("hqhq") // res1: Boolean = true
patternFound("cccx") // res2: Boolean = false
但我怀疑,如上所述,您的要求并不足以涵盖您正在寻找的内容。
<强>更新强>
你现在的第二个要求毫无意义。与第一个模式不匹配的 Everything 将返回false
,因此测试返回false
的特定模式没有意义。
def patternFound(s:String): Boolean = {
val ptrn = "(.)(.)\\1\\2".r.unanchored
s match {
case ptrn(_,_) => true
case _ => false
}
}
patternFound("babab") //true because pattern of xyxy found in it
patternFound("baabba") //false because it doesn't match the target pattern