从正则表达式匹配中解压缩所有组

时间:2014-04-08 14:40:36

标签: regex scala

从regex中解压缩匹配的组是一种非常好的方法:

scala> val regex = "(first):(second)".r
regex: scala.util.matching.Regex = (first):(second)

scala> val regex(a, b) = "first:second"
a: String = first
b: String = second

不幸的是,当没有匹配时抛出异常:

scala> val regex(a, b) = "first:third"
scala.MatchError: first:third (of class java.lang.String)
        at .<init>(<console>:10)
        at .<clinit>(<console>)
        at .<init>(<console>:11)
        at .<clinit>(<console>)
        at $print(<console>)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
        at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
        at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
        at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
        at java.lang.Thread.run(Thread.java:744)

在这种情况下,我可以使用findFirstMatchIn来获取None没有匹配项:

scala> val result = regex.findFirstMatchIn("first:third")
result: Option[scala.util.matching.Regex.Match] = None

但是在匹配的情况下,我希望能够通过解包来获得与第一个变体一样好的东西。现在我必须处理这个问题:

scala> val result = regex.findFirstMatchIn("first:second")
result: Option[scala.util.matching.Regex.Match] = Some(first:second)

我想出的是:

scala> val content = result.get
content: scala.util.matching.Regex.Match = first:second

scala> 1 to content.groupCount map content.group
res0: scala.collection.immutable.IndexedSeq[String] = Vector(first, second)

有没有更好的方法从regex匹配对象中获取所有组(理想情况下,在此问题的第一个代码段中解压缩为简洁)?

2 个答案:

答案 0 :(得分:3)

他们为此提出了Groups

scala> regex findFirstMatchIn "first:second" map { case Regex.Groups(a,b) => (a,b) }
res8: Option[(String, String)] = Some((first,second))

我认为现在的情况与:

相同
scala> regex findFirstMatchIn "first:second" map { case regex(a,b) => (a,b) }
res9: Option[(String, String)] = Some((first,second))

因为它没有重新计算比赛。

答案 1 :(得分:1)

您可以使用模式匹配

此事(未经测试)

val regex = "(first):(second)".r
val myString = "first:second"
myString  match {
    case regex(first, second) => do something
    case _ => None
}