Чтобы получить только правильные символы, вы должны исключить правую фигурную скобку из вашей группы [^}]+
.На самом деле, лучше просто включить конкретный шаблон, который вы ищете, для раннего обнаружения ошибок:
Pattern pattern = Pattern.compile("\\$\\{([a-z]\\.[a-z]+)\\}");
Метод Matcher.replaceAll(Function<MatchResult,String> replacer)
предназначен для выполнения именно того, что вы запрашиваете.Функция, переданная методу, получает каждое совпадение и возвращает строку для ее замены.
В вашем случае:
pattern.matcher(input).replaceAll(mr -> resolveMatchedValue(mr.group(1)));
Возвращает строку, в которой все подстроки соответствуют вашему шаблону.
Вот рабочий пример, который только заглавные буквы полей:
System.out.println(Pattern.compile("\\$\\{([[a-z]\\.[a-z])\\}")
.matcher("hey.there.man.${a.a}crazy$carl${a.b}jones")
.replaceAll(mr -> mr.group(1).toUpperCase()));
До Java 9 эквивалент:
StringBuffer result = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(result, resolvedMatchedValue(matcher.group(1)));
}
matcher.appendTail(result);
После чего result.toString()
содержит новую строку.