Метод replaceAll () String и escape-символы

17

Линия

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

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

    
задан WickeD 02.06.2012 в 22:31
источник

6 ответов

21

При замене символов с помощью регулярных выражений вы можете использовать обратные ссылки, например , для замены с помощью группировки в матче.

Это, однако, означает, что обратная косая черта является специальным символом, поэтому, если вы действительно хотите использовать обратную косую черту, ее нужно экранировать.

Это означает, что для его использования в строке Java он должен быть дважды экранирован. (Сначала для синтаксического анализатора строк, затем для парсера регулярных выражений.)

    
ответ дан Reverend Gonzo 02.06.2012 в 22:38
источник
12

javadoc replaceAll говорит:

  

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

    
ответ дан JB Nizet 02.06.2012 в 22:38
источник
4

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

String trickyString = "$Ha!I'm tricky|.|";
String safeToUseInReplaceAllString = Pattern.quote(trickyString);
    
ответ дан Gorky 30.09.2014 в 06:04
источник
2

Это форматированное добавление к моему комментарию

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

БОЛЬШЕ ЧИТАЕМОГО И ЗНАЧИТЕЛЬНОГО, ЧЕМ

s = s.replaceAll("\.", "\\\");
    
ответ дан Christophe Blin 02.10.2013 в 12:20
источник
0

Обратная косая черта - это символ escape в строках Java. например обратная косая черта имеет предопределенное значение в Java. Вы должны использовать «\ \» для определения одного обратного слэша. Если вы хотите определить «\ w», вы должны использовать «\ \ w» в своем регулярном выражении. Если вы хотите использовать обратную косую черту как литерал, вы должны ввести \ \ \ \ as \ также escape-символ в регулярных выражениях.     

ответ дан David Mathias 02.06.2012 в 22:49
источник
0

Я считаю, что в этом конкретном случае было бы проще использовать замену вместо замены всех. Преподобный Гонзо Правильный ответ, когда он говорит об исчезновении персонажа.

Использование replaceAll:

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

Использование replace:

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

replace просто берет строку для соответствия, а не регулярное выражение.     

ответ дан Bogoth 13.12.2014 в 01:50
источник