从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匹配对象中获取所有组(理想情况下,在此问题的第一个代码段中解压缩为简洁)?
答案 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
}