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

Метод 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() заменяет точку (\\.) на (\\\\).

Может кто-нибудь объяснить это?

4b9b3361

Ответ 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 просто берет строку для соответствия, а не регулярное выражение.