Вы не хотите использовать matches()
. Матчи будут пытаться соответствовать всей входной строке.
Попытка сопоставить весь регион с шаблоном.
Что вам нужно group 0
. Это будет соответствовать каждому экземпляру вашего шаблона. Ознакомьтесь с документацией find()
.
В каждом матче group 1
будет вся строка ( ${appdata}
) и appdata
будет appdata
частью.
Ваш конечный результат должен выглядеть примерно так:
String pattern = "\$\{([A-Za-z0-9]+)\}";
Pattern expr = Pattern.compile(pattern);
Matcher matcher = expr.matcher(text);
while (matcher.find()) {
String envValue = envMap.get(matcher.group(1).toUpperCase());
if (envValue == null) {
envValue = "";
} else {
envValue = envValue.replace("\", "\\");
}
Pattern subexpr = Pattern.compile(Pattern.quote(matcher.group(0)));
text = subexpr.matcher(text).replaceAll(envValue);
}