Как исправить проблему игнорирования 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
→ Ссылка
- Основная ошибка в проверке на совпадение, строка
if (!m.find()) return string;лишняя. - Удалите
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();
}