加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:59:55 所属栏目:安全 来源:网络整理
导读:据我所知,非文档中的非捕获组由(:?)定义,就像在 Java中一样. (我相信它是相同的底层库). 但是,这似乎不起作用: var R = "a(:?b)c".rR.findFirstMatchIn("abc").get.group(1) 返回“b”(当它应为空时).我怀疑这通常不是问题,但在进行模式匹配时,这意味着我
据我所知,非文档中的非捕获组由(:?)定义,就像在 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

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

解决方法

除了正确的答案,请使用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)的提取器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读