2017-07-17 28 views
2

如果我這樣做,它是工作的罰款:斯卡拉:在正則表達式模式字符串連接字符串造成問題

val string = "somestring;userid=someidT;otherstuffs" 

var pattern = """[;?&]userid=([^;&]+)?(;|&|$)""".r 

val result = pattern.findFirstMatchIn(string).get; 

但是,當我這樣做

val string = "somestring;userid=someidT;otherstuffs" 

val id_name = "userid" 

var pattern = """[;?&]""" + id_name + """=([^;&]+)?(;|&|$)""".r 

val result = pattern.findFirstMatchIn(string).get; 

我得到一個錯誤這是錯誤:

error: value findFirstMatchIn is not a member of String

回答

2

您可以使用插值的字符串文字,使用簡單一點的正則表達式:

val string = "somestring;userid=someidT;otherstuffs" 
val id_name = "userid" 
var pattern = s"[;?&]${id_name}=([^;&]*)".r 
val result = pattern.findFirstMatchIn(string).get.group(1) 
println(result) 
// => someidT 

Scala demo

[;?&]$id_name=([^;&]*)圖案發現;?&然後userId(因爲${id_name}被內插),然後=匹配,然後比;&其他任何0+字符被捕獲到組1,則返回。

注意:如果要將$用作插入字符串文字中的字符串錨點的結尾,請使用$$

還有,記得Regex.quote("pattern")如果變量可能含有特殊的正則表達式的運營商如()[等見Scala: regex, escape string

+0

我相信他最後也需要'([;&] | $)'。 – sln

+0

然後它應該是內插字符串文字中的'([;&] | $$)'。我相信這裏沒關係。 –

+0

這看起來需要我,它怎麼不重要? – sln

2

在字符串周圍添加括號,以便在構建字符串之後創建正則表達式周圍的其他方式:

var pattern = ("[;?&]" + id_name + "=([^;&]+)?(;|&|$)").r 
// pattern: scala.util.matching.Regex = [;?&]userid=([^;&]+)?(;|&|$) 

val result = pattern.findFirstMatchIn(string).get; 
// result: scala.util.matching.Regex.Match = ;userid=someidT; 
相關問題