2016-10-18 31 views
1

我是新來的Scala,我不太確定正則表達式是如何工作的。在scala中的正則表達式,找到對應於一個鍵的值

我想從字符串中提取一個值。

String = "key1=value1&key2=value2&key3=value3" 

我需要找出什麼是值2

我可以用正則表達式嗎?任何指針?

到目前爲止,我試過,但它不工作:

"/key2=([^&]*)/" 
+0

請出示整個相關代碼分裂。 –

+0

提示:你不需要'/',''key2 =([^&] *)「'可能是你所需要的。 –

+0

謝謝你的工作。 –

回答

2

這裏有一個方法來匹配你需要使用match和非錨定的正則表達式:

var str = "key1=value1&key2=value2&key3=value3" 
val pattern = """key2=([^&]*)""".r.unanchored 
val res = str match { 
    case pattern(res) => println(res) 
    case _ => "No match" 
} 

this demo

請注意,在match中,該模式默認爲錨定,並且爲了在字符串內部的任何位置找到匹配項,您應該使模式爲.unanchored

0

可以匹配需要的值使用下面的正則表達式的第一場比賽組,

^.*?key1=(.+?)(&.*?)*$ 
^.*?key2=(.+?)(&.*?)*$ 
^.*?key3=(.+?)(&.*?)*$ 
... 

這取決於事實&不會出現在您的values的任何地方。你可以用它的一些更多的實驗 - regex101 link

現在,讓我們移動到所需的斯卡拉,

def findValueForKeyI(i: Int, str: String): Option[String] = { 
    val regex = ("^.*?key" + i + "=(.+?)(&.*?)*$").r 
    val matcher = regex.pattern.matcher(str) 
    matcher.matches match { 
    case true => Some(matcher.group(1)) 
    case _ => None 
    } 
} 

現在讓我們嘗試在斯卡拉控制檯,

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

def findValueForKeyI(i: Int, str: String): Option[String] = { 
    val regex = ("^.*?key" + i + "=(.+?)(&.*?)*$").r 
    val matcher = regex.pattern.matcher(str) 
    matcher.matches match { 
    case true => Some(matcher.group(1)) 
    case _ => None 
    } 
} 

// Exiting paste mode, now interpreting. 

findValueForKeyI: (i: Int, str: String)Option[String] 

scala> val str = "key1=value1&key2=value2&key3=value3" 
str: String = key1=value1&key2=value2&key3=value3 

scala> findValueForKeyI(1, str) 
res24: Option[String] = Some(value1) 

scala> findValueForKeyI(2, str) 
res25: Option[String] = Some(value2) 

scala> findValueForKeyI(3, str) 
res26: Option[String] = Some(value3) 

scala> findValueForKeyI(4, str) 
res27: Option[String] = None 
1

你也可以沒有正則表達式。首先使用&,然後使用=

str.replaceAll("\\s+", "").split("&") 
.map { str => 
    val Array(a, b) = str.split("=") 
    a -> b 
}.toMap.get("key2") 

斯卡拉REPL

scala> str.replaceAll("\\s+", "").split("&").map { str => val Array(a, b) = str.split("="); a -> b }.toMap.get("key2") 
res23: Option[String] = Some("value2")