Java Matcher ищет и заменяет только некоторые совпадения

#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, еще один драгоценный камень регулярных выражений, который я, вероятно, должен был знать. Еще раз спасибо!