我对下面示例中的 _ * 用法有点困惑。它的行为有所不同,我完全无法弄清楚这一点。
val p1="scala".r
val p2="([0-9]+[.]?[0-9]*|[.][0-9]+)$".r
"scala" match {case p1(_) => true case _ => false } // return false
"scala" match {case p1(_ *) => true case _ => false } // return true
"9" match {case p2(_) => true case _ => false} // return true
提前致谢。
最佳答案
match
模式中至少需要一个捕获组,因为您使用的是 case(_)
.这是因为“match-case”使用 unapplySeq(target: Any): Option[List[String]]
,它返回捕获组值,并且您需要 1 个捕获值与 _
一起出现.与 _ *
,您忽略此要求。见 Scala regex reference :
To check only whether the Regex matches, ignoring any groups, use a sequence wildcard:
"2004-01-20" match { case date(_*) => "It's a date!" }
您的
p2
包含一个捕获组,因此最后一行返回 true。您的
p1
不包含捕获组,因此第一个 match
失败。第二个没有,因为您使用 *
禁用了此要求.作为替代方案,您可以使用
case p1()
用你的第一行(代表强制性第一个捕获组的 _
在这里被删除),它也可以工作:"scala" match {case p1() => true case _ => false }) // return true
看到这个 IDEONE demo
关于regex - _ * 用法是scala模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36324437/