如果我这样做,它工作正常:
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;
这是错误:
错误:值findFirstMatchIn不是String
的成员
答案 0 :(得分: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;
答案 1 :(得分: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}
被插值)然后{{1匹配,然后除了=
和;
以外的任何0 +字符都会被捕获到返回的第1组中。
注意:如果要在插值字符串文字中使用&
作为字符串锚点的结尾,请使用$
。
此外,请记住$$
该变量是否包含Regex.quote("pattern")
,(
,)
等特殊正则表达式运算符。请参阅Scala: regex, escape string。