繁体   English   中英

_ *用法是scala模式匹配

[英]_ * usage is scala pattern matching

我在下面的例子中对_ *用法感到困惑。它表现得与众不同,我完全迷失了。

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正则表达式参考

要仅检查正则表达式是否匹配,忽略任何组,请使用序列通配符

"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演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM