Java RegEx模式,用于查找格式为$ VAR或$ {VAR}的Unix env变量

时间:2012-10-25 19:02:22

标签: java regex

适用于$ {VAR}:

Pattern.compile("\\$\\{(.+?)\\}"); 

但我正在努力格式化它,以便它接受$ VAR到下一个单词边界(\ b)。因为文字可以是

$FIRSTVAR.${SECONDVAR}LITERAL

然后我想检测$ FIRSTVAR和$ {SECONDVAR},如果第一个是“X”而第二个是“Y”,我想将它替换为 X.YLITERAL 。该模板使用$ VAR和$ {VAR}样式,如果var后跟非单词字符,则更喜欢前者,但如果是,则使用后者(就像我在上面给出的示例中一样)。

我试过

Pattern.compile("\\$(\\{|)(.+?)(\\}|\b})");

但是匹配 FIRSTVAR。$ {SECONDVAR 作为组(2)。所以这不好。 提前致谢

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)

我想添加一个新模式

Pattern.compile("\\$(\\{?(\\w+)\\}?)\\.?");

它会反过来引用你的内容:Demo但这会匹配像$firstvar$secondvar}literal这样的内容,我不知道它是否正确。

如果它只用于2个变量......

Pattern.compile("\\$(\\{?(\\w+)\\}?)\\.(?:\\$(\\{?(\\w+)\\}?))?");

Demo 2

第三次审核是否符合您的要求Demo 3

请记住,您可以使用(?<groupname>group)

命名群组