#java #search #replace #conditional-statements
#java #Поиск #заменить #условные операторы
Вопрос:
Я выполняю стандартный цикл поиска и замены в Java, используя Matcher, find, appendReplacement и appendTail. Моя проблема в том, что у меня есть дополнительное условие, которое должно быть истинным, чтобы определить, действительно ли я должен выполнить замену или оставить строку неповрежденной при определенном совпадении.
Pattern p = Pattern.compile("Some Regex");
Matcher m = p.matcher("Some buffer of text which needs some replacements.");
StringBuffer updatedBuffer = new StringBuffer();
while (m.find()) {
if (someCondition) {
m.appendReplacement(updatedBuffer, "Some Replacement");
}
else {
// leave the text unchanged at this point.
// is there something equivalent to: m.appendOriginal(updatedBuffer)
}
}
m.appendTail(updatedBuffer);
Я могу вычислить это, удерживая end() последнего совпадения, используя end() этого совпадения и извлекая из исходной строки, но подумал, что может быть более подходящий способ сделать это. Спасибо за любую помощь.
Комментарии:
1. Этот вопрос может быть более подходящим для сайта code review stack exchange. Они могут критиковать ваш код и предлагать предложения по его улучшению. Вопросы для переполнения стека должны иметь какую-то воспроизводимую проблему в коде.
Ответ №1:
StringBuffer updatedBuffer = new StringBuffer();
while (m.find()) {
m.appendReplacement(updatedBuffer,
someCondition ? "Some Replacement" : m.group());
}
m.appendTail(updatedBuffer);
Или
return Pattern.compile("Some Regex")
.matcher("Some buffer of text which needs some replacements.")
.replaceAll(mr -> condition ? "Some Replacement" : mr.group());
где mr — результат сопоставления, аналогичный методам сопоставления.
Комментарии:
1. Спасибо, Joop. Я всегда использовал group(int) для ссылки на совпадающие вложенные совпадения в скобках и не заметил перегрузки group (void) для всего совпадения. Очень признателен!
2. Joop, еще один драгоценный камень регулярных выражений, который я, вероятно, должен был знать. Еще раз спасибо!