2016-10-06 50 views
0

我有一個正則表達式斯卡拉看起來像:提取匹配的組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}" 
    } 
} 

任何想法,我怎麼能做到這一點?

回答

1

你可以做到這一點定義在你的正則表達式組:

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

,然後提取組的值是這樣的:

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

正如@Nyavro提到你需要parenthesis提取匹配的零件

除了模式匹配,你也可以做到這一點。

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

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

斯卡拉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 

這句法是很方便,但要小心在哪裏匹配不會發生這種情況。當匹配沒有發生時,這將引發異常。因此,正確處理代碼中的異常。

+0

這不會增加任何東西到接受的答案,除了一些更通用的語法,OP沒有要求,幾乎肯定是一個壞的想法,像正則表達式匹配。 –