Заменить текст в StringBuilder через регулярное выражение - PullRequest
5 голосов
/ 28 января 2011

Я хотел бы заменить некоторые тексты в StringBuilder.Как это сделать?

В этом коде я получил java.lang.StringIndexOutOfBoundsException в строке с matcher.find():

StringBuilder sb = new StringBuilder(input);
Pattern pattern = Pattern.compile(str_pattern);
Matcher matcher = pattern.matcher(sb);
while (matcher.find())
  sb.replace(matcher.start(), matcher.end(), "x"); 

Ответы [ 6 ]

4 голосов
/ 28 января 2011

Позволяет иметь StringBuilder с общей длиной 50, и вы заменяете первые 20 символов на 'x'.Таким образом, StringBuilder сокращается на 19, верно - однако исходный входной файл pattern.matcher (sb) не изменяется, поэтому в конце StringIndexOutOfBoundsException.

2 голосов
/ 28 января 2011

Я решил это, добавив matcher.reset():

    while (matcher.find())
    {
        sb.replace(matcher.start(), matcher.end(), "x");
        matcher.reset();
    }
1 голос
/ 02 февраля 2011

Вы не должны делать это таким образом. Вход в Matcher может быть любой CharSequence, но последовательность не должна изменяться. Совпадение, как у вас, похоже на итерацию по Коллекции при одновременном удалении элементов, это не может работать.

Однако, возможно, есть решение:

while (matcher.find()) {
    sb.replace(matcher.start(), matcher.end(), "x");
    matcher.region(matcher.start() + "x".length(), sb.length());
}
1 голос
/ 28 января 2011

Это уже сообщенная ошибка, и я предполагаю, что в настоящее время они ищут исправление для нее. Подробнее здесь .

0 голосов
/ 04 февраля 2011

Другая проблема с использованием StringBuidler.replace () заключается в том, что нельзя обрабатывать группы захвата.

0 голосов
/ 04 февраля 2011

Может быть:

    int lookIndex = 0;
    while (lookIndex < builder.length() && matcher.find(lookIndex)) {
        lookIndex = matcher.start()+1;
        builder.replace(matcher.start(), matcher.end(), repl);
    }

...

.find (n) с целочисленным аргументом утверждает, что сбрасывает совпадение до того, как оно начнет искать указанный индекс. Это помогло бы решить проблемы, поднятые в комментарии выше.

...