我是新來的Scala,我不太確定正則表達式是如何工作的。在scala中的正則表達式,找到對應於一個鍵的值
我想從字符串中提取一個值。
String = "key1=value1&key2=value2&key3=value3"
我需要找出什麼是值2。
我可以用正則表達式嗎?任何指針?
到目前爲止,我試過,但它不工作:
"/key2=([^&]*)/"
我是新來的Scala,我不太確定正則表達式是如何工作的。在scala中的正則表達式,找到對應於一個鍵的值
我想從字符串中提取一個值。
String = "key1=value1&key2=value2&key3=value3"
我需要找出什麼是值2。
我可以用正則表達式嗎?任何指針?
到目前爲止,我試過,但它不工作:
"/key2=([^&]*)/"
這裏有一個方法來匹配你需要使用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"
}
請注意,在match
中,該模式默認爲錨定,並且爲了在字符串內部的任何位置找到匹配項,您應該使模式爲.unanchored
。
可以匹配需要的值使用下面的正則表達式的第一場比賽組,
^.*?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
你也可以沒有正則表達式。首先使用&
,然後使用=
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")
請出示整個相關代碼分裂。 –
提示:你不需要'/',''key2 =([^&] *)「'可能是你所需要的。 –
謝謝你的工作。 –