[英]how to replace all occurences of a word in a string with another word in java?
[英]Java - Replace all occurences of '${' in string
我正在使用 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>
使用此代碼在 memory 中完成這些變量的替換。 請注意,我首先替換了變量聲明部分中的變量,然后再繼續在文檔的主要部分中進行替換。
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 '}'
我的問題:
如何將“${”和“}”轉義為文字字符串,以便它不將其用作正則表達式?
問題來自可能包含${
而沒有}
的動態(用戶定義)替換,因此正則表達式引擎會認為存在損壞的命名反向引用。
您可以在沒有手動 escaping 的情況下保留分隔符,並依靠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))
我可以建議一種不同的方法嗎? 匹配所有出現的${...}
然后在回調中替換它們。 這看起來比多次替換字符串更直接、更有效。
Java 9 是這樣的:
Map<String, String> variables = …;
Pattern pattern = Pattern.compile("\\$\\{([^}]+)\\}");
String replaced = pattern.matcher(your_input_string)
.replaceAll(mr -> {
String placeholderName = mr.group(1);
// fall back to placeholder when not defined:
return variables.getOrDefault(placeholderName, mr.group(0));
});
這是一個工作演示示例: https://ideone.com/3XxRk4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.