Как заменить плейсхолдеры на конкретные числа?

Пример: Совершен перевод ${payment_amount} рублей. На счету осталось ${balance} рублей.

public String replacePlaceholders(double paymentAmount, double balance) {
        File file = new File(
                "data.txt");
        try (Scanner scanner = new Scanner(file)) {
            while (scanner.hasNextLine()) {
                String regexPaymentAmount = "[$]{1}[{]{1}[a-z]{7}[_]{1}[a-z]{6}[}]{1}";
                String regexBalance = "[$]{1}[{]{1}[a-z]{7}[}]{1}";
                String line = scanner.nextLine();

                Pattern pattern1 = Pattern.compile(regexPaymentAmount);
                Pattern pattern2 = Pattern.compile(regexBalance);
                Matcher matcher1 = pattern1.matcher(line);
                Matcher matcher2 = pattern2.matcher(line);
                String result1 = matcher1.replaceAll(Double.toString(paymentAmount));
                String result2 = matcher2.replaceAll(Double.toString(balance));
                return null; //Нужна результирующая строка с заменой двух плейсхолдеров;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

Ответы (2 шт):

Автор решения: Alexey R.

можно просто использовать стандартный replace стринга. Например так:

public String replacePlaceholders(double paymentAmount, double balance){
    String base = "Совершен перевод ${payment_amount} рублей. На счету осталось ${balance} рублей.";
    return base
            .replace("${payment_amount}", String.valueOf(paymentAmount))
            .replace("${balance}", String.valueOf(balance));
}

UPD: вариант с регулярками:

public String replacePlaceholders(double paymentAmount, double balance){
    String base = "Совершен перевод ${payment_amount} рублей. На счету осталось ${balance} рублей.";
    Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}");
    Matcher matcher = pattern.matcher(base);
    while(matcher.find()){
        String propName = matcher.group(1);
        String propValue;
        switch (propName){
            case "payment_amount": propValue = String.valueOf(paymentAmount); break;
            case "balance": propValue = String.valueOf(balance); break;
            default: throw new IllegalArgumentException("Cannot parse input string string");
        }
        base = base.replace(matcher.group(), propValue);
    }
    return base;
}
→ Ссылка
Автор решения: Alexander Mashin

Как насчёт

Matcher matcher1 = pattern1.matcher(line);
String result1 = matcher1.replaceAll(Double.toString(paymentAmount));
Matcher matcher2 = pattern2.matcher(result1);
String result2 = matcher2.replaceAll(Double.toString(balance));
return result2;

?

→ Ссылка