簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM