您寻求的行为是:
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
如果没有捕获任何内容。