помогите с использованием Java Matcher для изменения группы - PullRequest
1 голос
/ 15 февраля 2010

Я хочу сопоставить регулярное выражение и изменить совпадение. вот моя функция. сейчас мой метод не меняет входные данные вообще. что случилось? спасибо.

    Matcher abbrev_matcher = abbrev_p.matcher(buffer);
    StringBuffer result = new StringBuffer();//must use stringbuffer here!
    while (abbrev_matcher.find()){
        //System.out.println("match found");
        abbrev_matcher.appendReplacement(result, getReplacement(abbrev_matcher));
    }
    abbrev_matcher.appendTail(result);

private static String getReplacement(Matcher aMatcher){
    StringBuilder temp = new StringBuilder(aMatcher.group(0));
    for (int i = 0; i < temp.length(); i++){
      if (temp.charAt(i) == '.'){
          temp.deleteCharAt(i);
      }

    }
    return temp.toString();
}

1 Ответ

1 голос
/ 15 февраля 2010

Вы просто хотите удалить все точки из сопоставленного текста? Здесь:

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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...