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" 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/

相关文章:

postgresql - 在 scala 框架中支持 PostgreSQL 特定的 array_agg 函数?

java - java项目的正则表达式

regex - 正则表达式只打印字符串中的重复字母

scala - 做某事最多 N 次或直到在 Scala 中满足条件

scala - 如何将 JSON 的 RDD 转换为 Dataframe?

scala - 为什么 sbt 一直告诉我添加 -deprecation 到 scalacOptions ?

Scala 创建类型别名的实例

java - 匹配带引号的正则表达式?

php - preg_replace() 捕获第一个匹配项

java - UTF-8 语言的正则表达式