我正在使用Java 1.8遍历包含这样定义的变量的文件。
<var name = "QUEUE_PREFIX" value = "TEST/QUEUE/PREFIX" />
<var name = "IN_QUEUE" value = "${QUEUE_PREFIX}/IN" />
<var name = "OUT_QUEUE" value = "${QUEUE_PREFIX}/OUT" />
<element>${IN_QUEUE}</element>
这应该导致
<var name = "QUEUE_PREFIX" value = "TEST/QUEUE/PREFIX" />
<var name = "IN_QUEUE" value = "TEST/QUEUE/PREFIX/IN" />
<var name = "OUT_QUEUE" value = "TEST/QUEUE/PREFIX/OUT" />
<element>TEST/QUEUE/PREFIX/IN</element>
这些变量的替换是使用此代码在内存中完成的。请注意,在继续文档主要部分的替换之前,我先替换了变量声明部分中的变量。
private static final String VAR_START = "\\$\\{"
private static final String VAR_END = "\\}"
private String fileContent = readFile(path);
private Map<String, String> variables = getVarsFromFile();
private void replaceInVariables() {
for(Entry<String, String> e : variables.entrySet()) {
fileContent = fileContent.replaceAll(VAR_START + e.getKey() + VAR_END, e.getValue);
}
}
我从这里收到以下错误
named capturing group is missing trailing '}'
我的问题:
如何将“ $ {”和“}”作为文字字符串进行转义,以使其不将其用作正则表达式?
这个问题是从动态(用户定义)更换可能包含${
没有}
,因此正则表达式引擎会认为这是一个腐败的命名反向引用。
您可以保留定界符而不进行手动转义,并依靠Pattern.quote
转义整个正则表达式模式和Matcher.quoteReplacement
转义替换模式:
private static final String VAR_START = "${";
private static final String VAR_END = "}";
// ...
fileContent = fileContent.replaceAll(Pattern.quote(VAR_START + e.getKey() + VAR_END), Matcher.quoteReplacement(e.getValue))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句