Мне нужно заменить
\\\s+\\$\\$ to $$
Я использовал
String s = " $$";
s = s.replaceAll("\\s+\\$\\$","$$");
но он выдает исключение
java.lang.IllegalArgumentException: ссылка на нелегальную группу
Мне нужно заменить
\\\s+\\$\\$ to $$
Я использовал
String s = " $$";
s = s.replaceAll("\\s+\\$\\$","$$");
но он выдает исключение
java.lang.IllegalArgumentException: ссылка на нелегальную группу
Используйте "\\$\\$"
во втором параметре:
String s=" $$";
s=s.replaceAll("\\s+\\$\\$","\\$\\$");
//or
//s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$");
$
является символом группы в параметре замены регулярного выражения
Итак, вам нужно сбежать от него
От 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("$$"));
Проблема здесь не в регулярном выражении, а в замене:
$используется для обозначения групп соответствия ()
. Таким образом, вам нужно также избежать его с помощью обратной косой черты (и второй обратный слэш, чтобы сделать компилятор java счастливым):
String s=" $$";
s = s.replaceAll("\\s+\\$\\$", "\\$\\$");
$
имеет особое значение в строке замены, а также в регулярном выражении, поэтому вы также должны избегать его:
s=s.replaceAll("\\s+\\$\\$", "\\$\\$");
String s="$$";
s=s.replaceAll("\\s+\\$\\$","$$");
У меня была такая же проблема, поэтому я в конечном итоге заменил все на 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();
}
Это правильный путь. Замените литерал $с помощью экранированного \\$
str.replaceAll("\\$", "\\\\\\$")