适用于$ {VAR}:
Pattern.compile("\\$\\{(.+?)\\}");
但我正在努力格式化它,以便它接受$ VAR到下一个单词边界(\ b)。因为文字可以是
$FIRSTVAR.${SECONDVAR}LITERAL
然后我想检测$ FIRSTVAR和$ {SECONDVAR},如果第一个是“X”而第二个是“Y”,我想将它替换为 X.YLITERAL 。该模板使用$ VAR和$ {VAR}样式,如果var后跟非单词字符,则更喜欢前者,但如果是,则使用后者(就像我在上面给出的示例中一样)。
我试过
Pattern.compile("\\$(\\{|)(.+?)(\\}|\b})");
但是匹配 FIRSTVAR。$ {SECONDVAR 作为组(2)。所以这不好。 提前致谢
答案 0 :(得分:1)
我会写:
Pattern.compile("\\$(?:(\\w+)|\\{(\\w+)\\})")
当然,这意味着 matcher.group(1)
或 matcher.group(2)
将成为变量名称 - 另一个将是null
- 所以你必须检查两者。
另一个不太健壮的选择是写:
Pattern.compile("\\$\\{?(\\w+))\\}?")
然后它将取代例如$SECONDVAR}
Y
而不是Y}
。
编辑添加:如果您使用的是Java 7,我认为您应该可以写
Pattern.compile("\\$(?:(?<varname>\\w+)|\\{(?<varname>\\w+)\\})")
然后使用matcher.group("varname")
检索变量名。 (我没有在Java中测试过,因为我只使用Java 6,而Java 6不支持命名的捕获组。但 在Perl中工作。)请参阅{{3} }和"Group name" in the java.util.regex.Pattern
javadoc。
答案 1 :(得分:0)