Я использую while(matcher.find())
для прокрутки всех совпадений шаблона. Для каждого экземпляра или соответствия этого шаблона он находит, я хочу заменить matcher.group(3)
на новый текст. Этот текст будет отличаться для каждого из них, поэтому я использую matcher.appendReplacement()
, чтобы перестроить исходную строку с новыми изменениями по мере ее прохождения. Однако appendReplacement()
заменяет весь шаблон вместо группы.Как appendReplacement в группе Matcher вместо всего шаблона?
Как это сделать, но только изменить третью группу матча, а не весь шаблон?
Вот несколько примеров кода:
Pattern pattern = Pattern.compile("THE (REGEX) (EXPRESSION) (WITH MULTIPLE) GROUPS");
Matcher matcher = pattern.matcher("THE TEXT TO SEARCH AND MODIFY");
StringBuffer buffer = new StringBuffer();
while(matcher.find()){
matcher.appendReplacement(buffer, processTheGroup(matcher.group(3));
}
, но я хотел бы сделать что-то вроде этого (очевидно, что это не работает).
...
while(matcher.find()){
matcher.group(3).appendReplacement(buffer, processTheGroup(matcher.group(3));
}
Нечто подобное, где оно заменяет определенную группу, а не весь шаблон.
EDIT: изменил пример регулярного выражения, чтобы показать, что не весь шаблон сгруппирован.
Это большое спасибо. Есть ли способ сделать это, если есть некоторые аспекты шаблона, которые не входят в группы? (Я отредактировал пример моего оригинального сообщения) – cottonBallPaws
Если вы должны включить эти части в соответствие (т. Е. Вы не можете оставить их вне шаблона), то вы захотите их захватить в группу, чтобы вы могли помнить, что они соответствовали и вернуть их в неизмененную часть вашей замены. – polygenelubricants
Обратите внимание, что это не сработает, если одна из согласованных строк содержит '$'. См. Ответ Уоррена ниже. – Mene