Вы можете использовать следующее решение:
String s = "${abc.xzy}/demo/${ttt.bbb}\ntest${kkk.mmm}";
Map<String, String> map = new HashMap<String, String>();
map.put("abc.xzy", "World");
map.put("ttt.bbb", "Hello");
map.put("kkk.mmm", "System");
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("\\$\\{([^{}]+)\\}").matcher(s);
while (m.find()) {
String value = map.get(m.group(1));
m.appendReplacement(result, value != null ? value : m.group());
}
m.appendTail(result);
System.out.println(result.toString());
См. Java-демо онлайн , вывод:
World/demo/Hello
testSystem
регулярное выражение
\$\{([^{}]+)\}
См. Демонстрация регулярных выражений . Он соответствует строке ${
, затем захватывает любые 1+ символов, отличные от {
и }
, в группу 1, а затем соответствует }
. Если значение «Группа 1» присутствует на карте в качестве ключа, заменой является значение ключа, в противном случае сопоставленный текст вставляется туда, где он был во входной строке.