使用Regex从字符串中提取变量

ps0*_*604 2 regex scala

我正在尝试使用以下格式从字符串变量中提取:$ {var}

鉴于此字符串:

val s = "This is a string with ${var1} and ${var2} and {var3}"
Run Code Online (Sandbox Code Playgroud)

结果应该是

List("var1","var2")
Run Code Online (Sandbox Code Playgroud)

这是尝试,它以异常结束.这个正则表达式有什么问题?

val pattern = """\${([^\s}]+)(?=})""".r
val s = "This is a string with ${var1} and ${var2} and {var3}"
val vals = pattern.findAllIn(s)

println(vals.toList)
Run Code Online (Sandbox Code Playgroud)

和例外:

线程"main"中的异常java.util.regex.PatternSyntaxException:

索引1附近非法重复 \${([^\s}]+)(?=})

roc*_*987 5

注意: - {在正则表达式中有特殊含义.它表示范围.例如a{2,10}表示比赛a中之间210次.所以你需要逃避{.

解决方案1

val pattern = """\$\{([^\s}]+)(?=})""".r
Run Code Online (Sandbox Code Playgroud)

您需要访问第一个捕获组以查找结果,然后将其更改为列表.

解决方案2

你也可以像lookbehind一样使用

val pattern = """(?<=\$\{)[^\s}]+(?=})""".r
Run Code Online (Sandbox Code Playgroud)

Ideone演示