Regex _*用法是scala模式匹配

Regex _*用法是scala模式匹配,regex,scala,Regex,Scala,我对下面例子中的*用法有点困惑。它的行为不同,我完全无法理解这一点 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

我对下面例子中的*用法有点困惑。它的行为不同,我完全无法理解这一点

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

提前感谢。

匹配的
模式中至少需要一个捕获组,因为您使用的是
case(41;
。这是因为“匹配案例”使用了
unplyseq(target:Any):选项[List[String]]
,该选项返回捕获组值,并且您需要1个捕获值与
\uu
一起出现。使用
。*
,您可以忽略此要求。见:

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

“2004-01-20”匹配{
案例日期(*)=>“这是一个日期!”
}

您的
p2
包含一个捕获组,因此最后一行返回true

您的
p1
不包含捕获组,因此第一个
匹配失败。第二个没有,因为您使用
*
禁用了此要求

作为替代方案,您可以在第一行中使用
case p1()
(表示强制第一个捕获组的
在这里被删除),它也可以工作:

"scala" match {case p1() => true case _  => false }) // return true

请参见此

匹配
模式中需要捕获组。使用
.*
,您可以忽略此要求。我已经更新了答案,并提供了更多解释和IDEONE的示例演示。incr 1-以前从未听说过它。@WiktorStribiżew非常感谢您