Вы просто хотите удалить все точки из сопоставленного текста? Здесь:
StringBuffer result = new StringBuffer();
while (abbrev_matcher.find()) {
abbrev_matcher.appendReplacement(result, "");
result.append(abbrev_matcher.group().replaceAll("\\.", ""));
}
abbrev_matcher.appendTail(result);
Причина appendReplacement(result, "")
заключается в том, что appendReplacement
ищет $1
, $2
и т. Д., Поэтому он может заменить их группами захвата. Если вы не передаете строковые литералы или другие строковые константы этому методу, лучше избегать этого шага обработки и использовать вместо этого метод append
StringBuffer's. В противном случае он может взорваться, если в замещающей строке есть знаки доллара или обратный слеш.
Что касается вашего getReplacement
метода, в моих тестах он меняет измененную строку, но не делает это правильно. Например, если строка ...blah...
, она возвращает .blah.
. Это потому, что каждый раз, когда вы вызываете deletecharAt(i)
в StringBuilder, вы изменяете индексы всех последующих символов. Вам придется перебирать строку назад, чтобы этот подход работал, но это того не стоит; просто начните с empty StringBuilder и постройте строку с помощью append
-ing вместо удаления. Это намного эффективнее и проще в управлении.
Теперь, когда я еще об этом подумаю, причина, по которой вы не видите никаких изменений, может заключаться в том, что ваш код генерирует исключение StringIndexOutOfBoundsException, которое вы не видите, потому что код выполняется в блоке try
и соответствующем Блок catch
пуст (классический Пустой блок захвата антишаблон). N'est-ce pas?