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

Error: User Rate Limit Exceeded

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

Error: User Rate Limit Exceeded\Error: User Rate Limit Exceeded

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

Error: User Rate Limit Exceeded\\Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

class ReplaceTest
{
    public static void main(String[] args)
    {
        String s = "hello.world";
        s = s.replaceAll("\\.", "\\\\");
        System.out.println(s);
    }
}

Error: User Rate Limit Exceeded

hello\world

Error: User Rate Limit Exceeded

hello\\world

Error: User Rate Limit ExceededreplaceAll()Error: User Rate Limit Exceeded\\.Error: User Rate Limit Exceeded\\\\).

Error: User Rate Limit Exceeded

Ответы на вопрос(7)

Мне не нравится эта реализация регулярных выражений. Мы должны быть в состоянии экранировать персонажей с одним «\»; не '\' ;. Но в любом случае, если вы хотите получить ЭТО.Out_Of_That, что вы можете сделать:

String prefix = role.replaceFirst("(\\.).*", "");

Таким образом, вы получите префикс = ЭТО;

Javadoc ofзаменить все говорит:

Note that backslashes ( \ ) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see Matcher.replaceAll. Use Matcher.quoteReplacement(java.lang.String) to suppress the special meaning of these characters, if desired.

Решение Вопроса

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

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

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

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

Используя replaceAll:

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

Используя заменить:

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

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

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

String trickyString = "$Ha!I'm tricky|.|";
String safeToUseInReplaceAllString = Pattern.quote(trickyString);

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

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

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

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

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

Ваш ответ на вопрос