3

驾驶室有人告诉我为什么这不起作用以及如何解决?

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”

实际的问题是在更复杂的正则表达式上尝试一系列匹配作为输入,并在第一个成功的模式上返回一个值。

4

2 回答 2

8

您寻求的行为是:

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

对于常规unapplycase p()匹配true. 对于unapplySeq,实现可以返回最后一个位置Seq的一个或一个元组Seq。正则表达式 unapply 返回Seq匹配组中的一个,或者Nil如果没有捕获任何内容。

于 2013-07-10T22:45:42.653 回答
8

用于模式匹配的“锚定”正则表达式匹配整个输入:

val aorb = ".*(a|b).*".r

"with a " match {
  case aorb(_) => "have a or b"
  case _ => "None"
}
// res0: String = have a or b

如果您在正则表达式中有捕获组,您还应该使用或明确忽略结果:注意_.aorb(_)

于 2013-07-10T13:51:56.890 回答