驾驶室有人告诉我为什么这不起作用以及如何解决?
val aorb = "(a|b)".r
aorb.findFirstIn("with a ")
res103: Option[String] = Some(a)
"with a " match { case aorb() => "have a or b" case _ => "None"}
res102: String = None
我希望匹配声明返回"有a或b"
实际问题是在输入的更复杂的正则表达式上尝试一系列匹配,并在第一个成功模式上返回一个值.
你寻求的行为是:
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如果没有捕获任何内容.
模式匹配的"锚定"正则表达式匹配整个输入:
val aorb = ".*(a|b).*".r
"with a " match {
  case aorb(_) => "have a or b"
  case _ => "None"
}
// res0: String = have a or b
如果你已经在你的正则表达式捕获组也应该使用或明确忽略的结果:注意_中aorb(_).