2010-02-15 2 views
1

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

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(); 
} 
+0

или если вы знаете какой-либо другой способ динамической замены. Я нашел этот код, но он использует только метод toLowerCase(). т.е. его нельзя настраивать. http://www.javapractices.com/topic/TopicAction.do?Id=80 – user273226

ответ

1

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

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 и т.д., так что он может заменить их с группами захвата. Если вы не передаете строковые литералы или другие строковые константы для этого метода, лучше избегать этого этапа обработки и вместо этого использовать метод StringBuffer append. В противном случае он будет стремиться взорваться, если в заменяющей строке есть какие-либо знаки доллара или обратные слэши.

Что касается вашего метода getReplacement, в моих тестах он делает, чтобы изменить согласованную строку, но она не делает это правильно. Например, если строка равна ...blah..., она возвращает .blah.. Это потому, что каждый раз, когда вы вызываете deletecharAt(i) на StringBuilder, вы меняете индексы всех последующих символов. Вам нужно будет перебирать строку назад, чтобы этот подход работал, но это не стоит; просто начните с пустым StringBuilder и создайте строку append -ing вместо удаления. Это намного эффективнее, а также легче управлять.

Теперь, когда я думаю об этом еще, по этой причине вы не видите каких-либо изменений может быть, что ваш код бросает StringIndexOutOfBoundsException, что вы не видите, потому что код работает в try блоке и соответствующий catch блок пуст (классический Empty Catch Block анти-шаблон). N'est-ce pas?

+0

Спасибо за вашу помощь Алан, но это не совсем то, что я пытаюсь сделать. «Dot delete» был просто примером. Я хочу сделать более сложную динамическую замену, например, сопоставление различных форм дат: «10 октября 2005 г., 10/10/2005, 10/10/05» и нормализации их. Возможно, это невозможно с помощью этих вспомогательных методов: -/ – user273226

+0

Конечно, это возможно, и то, как вы это делаете, справедливо. У вас просто есть ошибка где-то, что не очевидно в коде, который вы опубликовали. Вместо этого попробуйте использовать класс Rewriter от Elliott Hughes, поэтому вам нужно написать только метод 'replacement': http://elliotth.blogspot.com/2004/07/java-implementation-of-rubys-gsub.html. –