Последовательные вызовы appendReplacement завершаются неудачно - PullRequest
1 голос
/ 06 июля 2011

3 группы в регулярном выражении:

pattern = (a) (b) 123 (c)

Мне нужно избавиться от а, б, с

на Java:

while (matcher.find()) {
  matcher.appendReplacement(sb, "");
  matcher.appendReplacement(sb, ""); // fails from here
  matcher.appendReplacement(sb, "");
}

исключение:

java.lang.StringIndexOutOfBoundsException: String index out of range: -30
    at java.lang.String.substring(Unknown Source)
    at java.lang.String.subSequence(Unknown Source)
    at java.util.regex.Matcher.getSubSequence(Unknown Source)
    at java.util.regex.Matcher.appendReplacement(Unknown Source)

Есть ли способ последовательно заменить соответствующие группы?

РЕДАКТИРОВАТЬ: sb является StringBuffer. Испытаны как пустые new StringBuffer(), так и не-emtpy new StringBuffer(target_text_str).

Java 1.6.0_21-b07

Ответы [ 2 ]

2 голосов
/ 06 июля 2011
pattern = "(a)(b)(123)(c)"

// ...

while (matcher.find()) {
  matcher.appendReplacement(sb, "$3");
}

См. документы

2 голосов
/ 06 июля 2011

Вы должны иметь только один appendReplacement() звонок на find() звонок:

while (matcher.find()) {
  matcher.appendReplacement(sb, "");
}

Это удалит каждое полное совпадение в вашем вводе.

Если, как вы указали, вы хотите удалить некоторые части матча, то вы должны сгруппировать часть, которую вы хотите сохранить , и добавить ее к замене. Используя шаблон ab(123)c, вы сделаете это:

while (matcher.find()) {
  matcher.appendReplacement(sb, "$1");
}

Если вам нужны другие группы по каким-то другим причинам (например, вам необходимо оценить их), то вы можете оставить их (т.е. использовать (a)(b)(123)(c) и ссылаться на третью группу, используя $3 вместо $1).

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