scala regex:从字符串中提取表达式

时间:2014-04-25 09:34:07

标签: regex scala

我想从字符串中提取表达式${*}

val example = "Hello ${foo.bar} World"

但是美元符号和大括号是表达式语法的一部分,所以我试图逃避它。

val expr = "\\$\\{[a-zA-Z0-9\\w]*\\}".r

但这不会奏效,println不会打印任何内容:

for (ex <- expr.findAllMatchIn(example)) println(ex)

任何人都知道出了什么问题?有一个更优雅的正则表达式吗?

2 个答案:

答案 0 :(得分:2)

这是因为你没有考虑.中的foo.bar,而是这样做:

\\$\\{[a-zA-Z0-9.\\w]*\\}             // allows for a . to also be in the string

为了获得最大的灵活性,您可以:

\\$\\{[^}]*.

答案 1 :(得分:2)

您可以使用更简单的正则表达式,并且可以通过使用三引号使其更容易阅读(避免需要双重转义\\):

val example = "Hello ${foo.bar} World ${bar.foo}"
                                              //> example  : String = Hello ${foo.bar} World ${bar.foo}

val expr = """\$\{.*?\}""".r                    //> expr  : scala.util.matching.Regex = \$\{.*?\}

for (ex <- expr.findAllMatchIn(example)) println(ex)
                                              //> ${foo.bar}
                                              //| ${bar.foo}