我有一个看起来像的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}"
}
}
关于如何实现这一目标的任何想法?
答案 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
这种语法非常方便,但请注意不会发生匹配的情况。当匹配没有发生时,这将抛出异常。因此,正确处理代码中的异常。