对于给定的字符串检查是否匹配模式[scala]

时间:2017-10-04 14:22:11

标签: regex scala functional-programming pattern-matching

我是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模式)

任何帮助表示赞赏!提前谢谢。

3 个答案:

答案 0 :(得分:0)

语法不正确。 你需要从函数体中删除“s matches”,它已经在方法定义行“(s)match”中。

另见https://docs.scala-lang.org/tour/pattern-matching.html

答案 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