Метод String replaceAll() и escape-символы
Линия
System.out.println("\\");
печатает одну обратную косую черту (\
). И
System.out.println("\\\\");
печатает двойные обратные слеши (\\
). Понял!
Но почему в следующем коде:
class ReplaceTest
{
public static void main(String[] args)
{
String s = "hello.world";
s = s.replaceAll("\\.", "\\\\");
System.out.println(s);
}
}
- результат:
hello\world
вместо
hello\\world
В конце концов, метод replaceAll()
заменяет точку (\\.
) на (\\\\
).
Может кто-нибудь объяснить это?
Ответы
Ответ 1
При замене символов с использованием регулярных выражений вы можете использовать обратные ссылки, такие как \1
, чтобы заменить используемую группировку в пределах соответствия.
Это, однако, означает, что обратная косая черта является специальным символом, поэтому, если вы действительно хотите использовать обратную косую черту, ее нужно экранировать.
Это означает, что для его использования в строке Java он должен быть дважды экранирован. (Сначала для синтаксического анализатора строк, затем для парсера регулярных выражений.)
Ответ 2
В javadoc replaceAll говорится:
Обратите внимание, что обратная косая черта (\) и знаки доллара ($) в замене строка может привести к тому, что результаты будут отличаться от того, рассматривается как буквальная строка замены; см. Matcher.replaceAll. использование Matcher.quoteReplacement(java.lang.String) для подавления специальных значение этих символов, если это необходимо.
Ответ 3
Если вам не нужно регулярное выражение для замены и просто нужно заменить точные строки, избегайте символов управления регулярным выражением перед заменой
String trickyString = "$Ha!I'm tricky|.|";
String safeToUseInReplaceAllString = Pattern.quote(trickyString);
Ответ 4
Это форматированное добавление к моему комментарию
s = s.replaceAll("\\.", Matcher.quoteReplacement("\\"));
БОЛЬШЕ ЧИТАЕМОГО И ЗНАЧИТЕЛЬНОГО, ЧЕМ
s = s.replaceAll("\\.", "\\\\\\");
Ответ 5
Обратная косая черта - это символ escape в строках Java. например обратная косая черта имеет предопределенное значение в Java. Вы должны использовать "\ \" для определения одного обратного слэша. Если вы хотите определить "\ w", вы должны использовать "\\w" в своем регулярном выражении. Если вы хотите использовать обратную косую черту как литерал, вы должны ввести \\\\ as\также escape-символ в регулярных выражениях.
Ответ 6
Я считаю, что в этом конкретном случае было бы проще использовать замену вместо замены всех.
Преподобный Гонзо Правильный ответ, когда он говорит об исчезновении персонажа.
Использование replaceAll:
s = s.replaceAll("\\.", "\\\\\\\\");
Использование replace:
s = s.replaceAll(".", "\\");
replace просто берет строку для соответствия, а не регулярное выражение.