Scala:如何将“ MatchesRegex”优化与包含反引号的正则表达式一起使用(改进的库)?

时间:2019-04-07 15:29:58

标签: scala

refined库允许定义与给定regex匹配的优化,如Readme所示:

import eu.timepit.refined._
import eu.timepit.refined.string._
import eu.timepit.refined.api.Refined

type MyType = String Refined MatchesRegex[W.`"[0-9]+"`.T]

虽然这很好用,但我们不能用这种方式定义与包含反引号的正则表达式匹配的类型,因为如描述here一样,无法在literal中转义反引号:

 type MyType = String Refined MatchesRegex[W.`"(a|`)"`.T]

 // Getting a compile-error:
 // ']' expected but ')' found.

那么有没有办法定义这种类型(即MatchesRegex的正则表达式包含反引号)?

1 个答案:

答案 0 :(得分:1)

一种方法是使用Scala 2.13或singleton types中可用的Typelevel Scala

对于Typelevel Scala,您需要在build.sbt中添加/替换:

scalaOrganization := "org.typelevel",
scalaVersion := "2.12.4-bin-typelevel-4", // Assuming you are using scala 2.12

您需要添加编译器标志-Yliteral-types

scalacOptions := Seq(
                  ..., // Other options
                  "-Yliteral-types"
                 )

现在refined类型可以简单地是:

import eu.timepit.refined._
import eu.timepit.refined.api.Refined

type MyType = String Refined MatchesRegex["""(a|`)"""]