Получение java.util.regex.PatternSyntaxException при использовании метода replaceAll

1

Я пытаюсь заменить текст, используя метод replaceAll, но получая эту ошибку

Caused by: java.util.regex.PatternSyntaxException: Illegal repetition near index 0
${rate+0.0020D2}

вот мой код

String regExp = "\\$\\{rate[+-]\\d+(\\.\\d+)D[0-9]\\}";
String text = "${rate+0.0020D2},banana,${rate-0.4002D3},${rate+0.2003D4},${rate+bananD4},${rate+.123.415D4}";

Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(text);

String match = null;

List<String> matches = new ArrayList<String>(5);
while (matcher.find()) {

    int startIndex = matcher.start();
    int endIndex = matcher.end();
    match = matcher.group();
    matches.add(match.substring(2, match.length() - 1));

}
String[] results = matches.toArray(new String[0]);
for(int i=0;i <= results.length;i++){
text.replaceAll(results[i],"<span class=\"rate\""+i+">"+results[i]+ "</span>");
}

Я могу решить эту проблему, если я использую text.replaceAll("\\$\\{rate+0.0020D2\\}","<span class=\"rate\""+i+">"+results[i]+ "</span>");

но я не могу этого сделать, потому что мое значение находится в переменной. есть ли какое-либо решение для этого

  • 2
    Сообщение об ошибке сообщает вам о проблеме: фигурные скобки используются для индикации повторения. Регулярное выражение "$ {rate ...", таким образом, недопустимо.
  • 0
    Используйте replace вместо replaceAll если вы не хотите, чтобы строка заменялась регулярным выражением
Теги:
replaceall
patternsyntaxexception

1 ответ

1

Ваше регулярное выражение: ${rate+0.0020D2}. Вам нужно избегать этого:

text.replaceAll(Pattern.quote(results[i]),"<span class=\"rate\""+i+">"+results[i]+ "</span>");
  • 0
    не работает до сих пор, получая это исключение java.lang.IllegalArgumentException: недопустимая ссылка на группу
  • 0
    @ user2142786 Используйте Matcher.quoteReplacement("<span ...") для второго аргумента replaceAll потому что в замене тоже нужно экранировать $
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню