0

这适用于 ${VAR}:

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

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

$FIRSTVAR.${SECONDVAR}LITERAL

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

我试过

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

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

4

2 回答 2

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 中有效。)请参阅javadoc中的“组名”java.util.regex.Patternjavadoc .java.util.regex.Matcher.group(java.lang.String)

于 2012-10-25T19:15:07.870 回答
0

我想添加一个新模式

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

它会反向引用你类似的东西:Demo但是那会匹配类似的东西$firstvar$secondvar}literal,我不知道它是否正确。

如果它仅适用于 2 个变量...

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

演示 2

第三次审查,如果它是你想要的Demo 3

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

于 2012-10-25T19:34:55.760 回答