Подтвердить что ты не робот

Почему replaceAll терпит неудачу с "незаконной ссылкой на группу"?

Мне нужно заменить

\\\s+\\$\\$ to $$

Я использовал

String s = "  $$";
s = s.replaceAll("\\s+\\$\\$","$$");

но он выдает исключение

java.lang.IllegalArgumentException: ссылка на нелегальную группу

4b9b3361

Ответ 1

Используйте "\\$\\$" во втором параметре:

String s="  $$";
s=s.replaceAll("\\s+\\$\\$","\\$\\$");
//or
//s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$");

$ является символом группы в параметре замены регулярного выражения

Итак, вам нужно сбежать от него

Ответ 2

От String # replaceAll javadoc:

Обратите внимание, что обратная косая черта (\) и знаки доллара ($) в замене строка может привести к тому, что результаты будут отличаться от того, рассматривается как буквальная строка замены; см. Matcher.replaceAll. использование Matcher.quoteReplacement(java.lang.String) для подавления специальных значение этих символов, если это необходимо.

Таким образом, экранирование произвольной строки замены может быть выполнено следующим образом:

String s = "  $$";
s = s.replaceAll("\\s+\\$\\$", Matcher.quoteReplacement("$$"));

Кроме того, экранирование шаблона может быть выполнено с помощью Pattern # quote

String s = "  $$";
s = s.replaceAll("\\s+" + Pattern.quote("$$"), Matcher.quoteReplacement("$$"));

Ответ 3

Проблема здесь не в регулярном выражении, а в замене:

$используется для обозначения групп соответствия (). Таким образом, вам нужно также избежать его с помощью обратной косой черты (и второй обратный слэш, чтобы сделать компилятор java счастливым):

String s="  $$";
s = s.replaceAll("\\s+\\$\\$", "\\$\\$");

Ответ 4

$ имеет особое значение в строке замены, а также в регулярном выражении, поэтому вы также должны избегать его:

s=s.replaceAll("\\s+\\$\\$", "\\$\\$");

Ответ 5

String s="$$";
        s=s.replaceAll("\\s+\\$\\$","$$");

Ответ 6

У меня была такая же проблема, поэтому я в конечном итоге заменил все на split.
Он решил исключение для меня

public static String replaceAll(String source, String key, String value){
    String[] split = source.split(Pattern.quote(key));
    StringBuilder builder = new StringBuilder();
    builder.append(split[0]);
    for (int i = 1; i < split.length; i++) {
        builder.append(value);
        builder.append(split[i]);
    }
    while (source.endsWith(key)) {
        builder.append(value);
        source = source.substring(0, source.length() - key.length());
    }
    return builder.toString();
}

Ответ 7

Это правильный путь. Замените литерал $с помощью экранированного \\$ str.replaceAll("\\$", "\\\\\\$")