在模式匹配时,是否可以使非捕获组在scala正则表达式中起作用

时间:2013-08-13 23:25:03

标签: regex scala

就我从文档中看到的那样,非捕获组由(:?)定义,就像在Java中一样。 (我相信它是相同的底层库)。

然而,这似乎不起作用:

var R = "a(:?b)c".r
R.findFirstMatchIn("abc").get.group(1)

返回“b”(当它应为空时)。我怀疑这通常不是问题,但在进行模式匹配时,这意味着我现在无法做到:

"abc" match {case R => println("ok");case _ => println("not ok")}
> not ok

我必须这样做:

"abc" match {case R(x) => println("ok");case _ => println("not ok")}
> ok

有没有办法让这项工作“符合预期”?

2 个答案:

答案 0 :(得分:7)

除了正确的答案,请使用val和parens:

scala> val R = "a(?:b)c".r  // use val
R: scala.util.matching.Regex = a(?:b)c

scala> "abc" match {case R() => println("ok");case _ => println("not ok")} // parens not optional
ok

您也可以始终使用通配符序列,而不关心是否指定了捕获组。我最近发现了这一点,发现它最清晰,最强大。

scala> "abc" match {case R(_*) => println("ok");case _ => println("not ok")} 
ok

如果匹配,_*将会发送,{包括提交者返回Some(null)

答案 1 :(得分:3)

好像你的语法错了。应该是(?:)。

http://docs.oracle.com/javase/tutorial/essential/regex/groups.html

  

以(?开头的组是纯粹的非捕获组,不捕获文本,不计入组总数。