您寻求的行为是:
scala> val aorb = "(a|b)".r
aorb: scala.util.matching.Regex = (a|b)
scala> val aorbs = aorb.unanchored
aorbs: scala.util.matching.UnanchoredRegex = (a|b)
scala> "with a or b" match { case aorbs(x) => Some(x) case _ => None }
res0: Option[String] = Some(a)
对于仅测试 a find,不要捕获该组:
scala> val aorbs = "(?:a|b)".r.unanchored
aorbs: scala.util.matching.UnanchoredRegex = (?:a|b)
scala> "with a or b" match { case aorbs() => true case _ => false }
res4: Boolean = true
scala> import PartialFunction._
import PartialFunction._
scala> cond("with a or b") { case aorbs() => true }
res5: Boolean = true
更新:这可能很明显,但是序列通配符匹配任何捕获组:
scala> val aorb = "(a|b).*(c|d)".r.unanchored
aorb: scala.util.matching.UnanchoredRegex = (a|b).*(c|d)
scala> "either an a or d" match { case aorb(_) => true case _ => false }
res0: Boolean = false
scala> "either an a or d" match { case aorb(_*) => true case _ => false }
res1: Boolean = true
对于常规unapply,case p()匹配true. 对于unapplySeq,实现可以返回最后一个位置Seq的一个或一个元组Seq。正则表达式 unapply 返回Seq匹配组中的一个,或者Nil如果没有捕获任何内容。