8

据我从文档中可以看出,非捕获组由 (:? ) 定义,就像在 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

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

4

2 回答 2

8

除了正确答案,使用 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)

于 2013-08-14T04:42:33.410 回答
4

看来您的语法错误。应该 (?:)。

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

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

于 2013-08-14T00:06:02.567 回答