为什么Scala正则表达式在模式匹配中的工作方式有所不同

时间:2019-05-17 09:11:51

标签: regex scala pattern-matching

我有一个简单的正则表达式val emailRegex = "\\w+@\\w+\\.\\w+".r,它与简单的电子邮件匹配(当然,不是用于生产)。当我运行以下代码时:

println(email match {
  case emailRegex(_) => "cool"
  case _ => "not cool"
})

printlnemailRegex.pattern.matcher(email).matches())

它打印not cooltrue。添加锚点也无济于事:"^\\w+@\\w+\\.\\w+$".r给出相同的结果。但是当我加上括号"(\\w+@\\w+\\.\\w+)".r时,它会打印cooltrue

为什么会这样?

2 个答案:

答案 0 :(得分:6)

正则表达式模式的参数数量应与正则表达式中捕获组的数量匹配。您的正则表达式没有任何捕获组,因此应有零个参数:

println(email match {
  case emailRegex() => "cool"
  case _ => "not cool"
})

printlnemailRegex.pattern.matcher(email).matches())

答案 1 :(得分:5)

因为与正则表达式进行模式匹配是关于捕获正则表达式组:

val email = "foo@foo.com"
val slightyDifferentEmailRegex = "(\\w+)@\\w+\\.\\w+".r // just add a group with two brackets
println(email match {
  case slightyDifferentEmailRegex(g) => "cool" + s" and here's the captured group: $g"
  case _ => "not cool"
})

打印:

  

很酷,这是捕获的组:foo