在下面的示例中,我对_ *的用法感到有些困惑。它的行为方式有所不同,因此我完全迷失了这一点。
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参考:
要只检查正则表达式是否匹配,忽略任何组,请使用序列通配符:
"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演示
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句