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

使用Applicative Functor匹配3个Scala Regex中的至少一个

发布时间:2020-12-16 10:03:42 所属栏目:安全 来源:网络整理
导读:我有三个 Scala正则表达式,我需要测试它们是否与给定的String匹配. 我知道我可以做以下事情: val matches = R1.findFirstIn(myString).isDefined || R2.findFirstIn(myString).isDefined || R3.findFirstIn(myString).isDefined 但我相信有一种方法可以使用
我有三个 Scala正则表达式,我需要测试它们是否与给定的String匹配.

我知道我可以做以下事情:

val matches = R1.findFirstIn(myString).isDefined ||
              R2.findFirstIn(myString).isDefined ||
              R3.findFirstIn(myString).isDefined

但我相信有一种方法可以使用Scalaz库中的Applicative Functor或Monad来实现.

如何才能做到这一点?

解决方法

这是Option的“first”(或“last”)monoid实例下的总和.在Scalaz 7中你可以写:

import scalaz._,Scalaz._

val R1 = "[a-c]".r
val R2 = "[d-f]".r
val R3 = "[g-i]".r

val m: Option[String] = List(R1,R2,R3).map(_.findFirstIn("test").first).suml

或者,或者:

val r1m = R1.findFirstIn("test").first
val r2m = R2.findFirstIn("test").first
val r3m = R3.findFirstIn("test").first

val m: Option[String] = r1m |+| r2m |+| r3m

请注意,这两个解决方案都返回匹配本身,如果您想要与实现中相同的行为,您当然可以调用isDefined.

作为旁注,| |对于第一个monoid实例,这里只是标准库中的orElse,所以你可以在没有Scalaz的情况下简洁地编写它:

List(R1,R3).map(_.findFirstIn("test")).reduce(_ orElse _)

这当然不是反对使用Scalaz的论据,因为它可以让我们更清晰地捕获抽象,并提供一种优雅的方式来改变关于是返回第一个还是最后一个的行为.

(编辑:李大同)

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

    推荐文章
      热点阅读