Scala:连接正则表达式模式字符串中的字符串导致问题

时间:2017-07-17 20:23:18

标签: regex scala

如果我这样做,它工作正常:

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

的成员

2 个答案:

答案 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

相关问题