gpt4 book ai didi

scala - Scala 是否提供了一种惯用的方式来部分匹配正则表达式以外的字符串?

转载 作者:行者123 更新时间:2023-12-05 01:22:47 25 4
gpt4 key购买 nike

这段代码实现了一种迷你字符串匹配语言——它理解两个符号(?=匹配任何字符,*=匹配一个或多个字符)。这段代码似乎工作得很好,但似乎有点不优雅。

object Re {
def check(search: String, input: String):Boolean = {
search match {
case `input` => true
case x if x.startsWith("?") =>
check(x.stripPrefix("?"), input.tail)
case x if x.startsWith("*") => input match {
case "" => false
case i => check(x.stripPrefix("*"), i.tail) | check(x, i.tail)
}
case _ => false
}
}
}

具体来说,我不喜欢我说 x if x.startswith(something) 然后必须去掉那个东西的情况。

scala 是否有更惯用的方法来做到这一点?与 Seq 匹配器的工作方式类似,因此我不需要 startsWith 或 stripPrefix。

最佳答案

如果 +: 能作为提取器就好了,但不幸的是类型转换失败了:

val head +: tail = "hello"

<console>:54: error: scrutinee is incompatible with pattern type;
found : Coll with scala.collection.SeqLike[T,Coll]
required: String
val head +: tail = "hello"
^

但是你可以定义一个类似的提取器:

object ~> {
def unapply(s: String): Option[(Char, String)] =
if (s.isEmpty) None else Some((s.charAt(0), s.substring(1)))
}

def check(search: String, input: String): Boolean = (search, input) match {
case (`input`, _) => true
case ('?' ~> stail, _ ~> itail) => check(stail, itail)
case ('*' ~> stail, _ ~> itail) => check(stail, itail) || check(search, itail)
case _ => false
}

assert(!check("gaga", "baba"))
assert( check("gaga", "gaga"))
assert(!check("?gaga", "gaga"))
assert( check("?gaga", "Xgaga"))
assert(!check("?gaga", "XYgaga"))
assert( check("*gaga", "Xgaga"))
assert( check("*gaga", "XYgaga"))
assert(!check("*gaga", "gaga"))

关于scala - Scala 是否提供了一种惯用的方式来部分匹配正则表达式以外的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40057426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com