Почему replaceAll (...) работает с двумя \\? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть этот текст, и мне нужно заменить все \ r \ n на \ n.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\r\n

Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus\r\n

et magnis dis parturient montes, nascetur ridiculus mus.\r\n 

Don12345

Когда я тестирую компилятор Java Regex онлайн, код 1 не работает.

Код 1

String result = myText.replaceAll("\r\n", "\n");

Но этот код работает :

Код 2

String result = myText.replaceAll("\\r\\n", "\n"); //second test

И согласно этому ответ , на самом деле должно быть четыре \

Почему код на втором тесте работает (код 2)?

ОБНОВЛЕНИЕ

На самом деле код 1 работает, извините за ошибку.

Код 1 Debug evaluation of code 1

Код 2 Debug evaluation of code 2

enter image description here

Итак, "\ r \ n" в моем тексте не является метасимвол?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

\ является escape-символом в регулярном выражении и может использоваться для экранирования самого себя, что означает, что вы можете написать \\n, чтобы соответствовать тексту \n и \\r на \r

Пожалуйста обратитесь к этому ответ

0 голосов
/ 19 июня 2020

Я не думаю, что следующее будет работать должным образом с String#replaceAll:

myText.replaceAll("\\r\\n", "\n")

Причина в том, что String#replaceAll ожидает регулярное выражение, и чтобы избежать \, вам нужно другой \, но поскольку это шаблон регулярного выражения, вам понадобится еще одна пара \\ (как вы это делаете, например, в \\s).

Это должно быть

myText.replaceAll("(\\\\r\\\\n)", "\n");

это означает, что \r\n будет заменено на \n.

В качестве альтернативы, вы можете использовать String # replace , который ожидает, что строка будет заменена вместо регулярного выражения как в случае с String # replaceAll т.е. myText.replace("\\r\\n", "\n") будет работать так же, как myText.replaceAll("(\\\\r\\\\n)", "\n").

public class Main {
    public static void main(String[] args) {
        String myText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\\r\\n\n" + "\n"
                + "Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus\\r\\n\n" + "\n"
                + "et magnis dis parturient montes, nascetur ridiculus mus.\\r\\n \n" + "\n" + "Don12345";

        System.out.println(myText);

        System.out.println("---------------------------------------------------------------------------");

        String result = myText.replaceAll("(\\\\r\\\\n)", "\n");
        System.out.println(result);
    }
}

Вывод:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\r\n

Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus\r\n

et magnis dis parturient montes, nascetur ridiculus mus.\r\n 

Don12345
---------------------------------------------------------------------------
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.


Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus


et magnis dis parturient montes, nascetur ridiculus mus.


Don12345
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...