Как исправить проблему игнорирования Patternом первого совпадения?

У меня есть функция, которая заменяет значение в {}, но она игнорирует первое совпадение. Т.е. В строке "{a} {b} {c}" она находит и заменяет всё кроме "{a}".

Паттерн:

\{(\w+)}

Код функции:

public static String replaceEmoji(@Nullable String string) {
        if (string == null || string.isEmpty()) return string;
 
        Matcher m = Pattern.compile("\\{(\\w+)}", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE).matcher(string);
 
        if (!m.find()) return string;
 
        StringBuilder sb = new StringBuilder();
        while (m.find()) {
            m.appendReplacement(
                    sb,
                    Emojis.getEmoji(m.group(1))
            );
        }
        m.appendTail(sb);
 
        return sb.toString();
    }

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

Автор решения: Wiktor Stribiżew
  1. Основная ошибка в проверке на совпадение, строка if (!m.find()) return string; лишняя.
  2. Удалите Pattern.CASE_INSENSITIVE | Pattern.MULTILINE, в вашем шаблоне нет ни букв, ни "якорей" ^ и $.
public static String replaceEmoji(@Nullable String string) {
    if (string == null || string.isEmpty()) return string;
 
    Matcher m = Pattern.compile("\\{(\\w+)}").matcher(string);

    StringBuilder sb = new StringBuilder();
    while (m.find()) {
        m.appendReplacement(
                sb,
                Emojis.getEmoji(m.group(1))
        );
    }
    m.appendTail(sb);
    return sb.toString();
}

См. пример работы кода на Java.

→ Ссылка