使用Scala正则表达式提取匹配组

时间:2016-10-06 10:20:03

标签: regex scala

我有一个看起来像的Scala正则表达式:

"fizz<[a-zA-Z0-9]+,[a-zA-Z0-9]+>"

我有一个使用此正则表达式并将其与字符串参数进行比较的方法。如果参数与正则表达式匹配,那么我想获得第一个匹配组(即,第一个[a-zA-Z0-9]+内的值),以及第二个匹配组。因此,如果我传入"fizz<herp,derp>"作为我的论点,我希望能够获得“herp”和“derp”:

def computeKey(buzz : String) : String = {
    var key : String = "blah"
    val regex = "fizz<[a-zA-Z0-9]+,[a-zA-Z0-9]+>".r
    if(buzz matches regex) {              // TODO: How do I do this check?
        val firstElement : String = ""    // TODO: Get this (ex: "herp")
        val secondElement : String = ""   // TODO: Get this (ex: "derp")

        // Ex: "herp-derp"
        key = s"${firstElement}-${secondElement}"
    }
}

关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:1)

您可以在regexp中定义组:

val regex = "fizz<([a-zA-Z0-9]+),([a-zA-Z0-9]+)>".r

然后以这种方式提取组的值:

buzz match {
  case regex(first, second) => s"$first, $second"
  case _ => "blah"
}

答案 1 :(得分:0)

正如@Nyavro所说,你需要parenthesis来提取匹配的部分

除了模式匹配之外,你也可以这样做。

val regex = "fizz<([a-zA-Z0-9]+),([a-zA-Z0-9]+)>".r

val regex(a, b) = "fizz<foo,bar>"

Scala REPL

scala> val regex = "fizz<([a-zA-Z0-9]+),([a-zA-Z0-9]+)>".r
regex: scala.util.matching.Regex = fizz<([a-zA-Z0-9]+),([a-zA-Z0-9]+)>


scala> val regex(a, b) = "fizz<foo,bar>"
a: String = foo
b: String = bar

这种语法非常方便,但请注意不会发生匹配的情况。当匹配没有发生时,这将抛出异常。因此,正确处理代码中的异常。