2
val AlphabetPattern = "^([a-z]+)".r

def stringMatch(s: String) = s match {
 case AlphabetPattern() => println("found")
 case _ => println("not found")
}

如果我尝试,

stringMatch("hello")

我得到“未找到”,但我希望得到“找到”。

我对正则表达式的理解,

[az] = 在 'a' 到 'z' 的范围内
+ = 前一个模式中的一个
^ = 以

所以正则表达式 AlphabetPattern 是“所有以 az 范围内的一个或多个字母开头的字符串”

当然我错过了一些东西,想知道什么。

4

2 回答 2

4

替换case AlphabetPattern()case AlphabetPattern(_)它可以工作。提取器模式采用将结果绑定到的变量。在这里我们将其丢弃,但您可以使用x或其他任何东西。

编辑:继兰德尔在下面的评论之后,如果您检查文档,Regex您会发现它有一个unapplySeq而不是一个unapply方法,这意味着它需要多个变量。如果你有错误的号码,它不会匹配,而是喜欢

list match { case List(a,b,c) => a + b + c }

如果list没有正好 3 个元素,则不匹配。

于 2013-07-18T17:46:52.080 回答
1

匹配语句存在一些问题。与检查s match的值相匹配,并且始终评估为,因为永远不等于 。使用其中一种方法来查找与给定 `Regex.sAlphabetPattern__s"^([a-z]+)".rfindScala.Util.Regex

例如,使用findFirstIn查找字符串中的第一个匹配项AlphabetPattern

scala> AlphabetPattern.findFirstIn("hello")
res0: Option[String] = Some(hello)

使用stringMatch方法findFirstIn和case语句:

scala> def stringMatch(s: String) = AlphabetPattern findFirstIn s match {
     | case Some(s) => println("Found: " + s)
     | case None => println("Not found")
     | }

stringMatch: (s:String)Unit                                   

scala> stringMatch("hello")                           
Found: hello
于 2013-07-18T17:37:07.443 回答