Вопрос по regex, java, string – Метод String's replaceAll () и escape-символы

21

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   ответов
3

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

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

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

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

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 за упоминание Matcher.quoteReplacement! РЕДАКТИРОВАТЬ: удалить код (я не собираюсь делать отступ с мини-уценкой)
0

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

0

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

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

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

0

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

Используя replaceAll:

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

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

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

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

23

ользовать обратные ссылки, такие как\1 заменить использование группировки в матче.

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

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

Да, точно...
поэтому в основном вы говорите, что синтаксический анализатор строк сначала проанализирует & quot; \\\\ & quot; в & quot; \\ & quot; который синтаксический анализатор регулярных выражений будет далее анализировать в & quot; \ ". Это оно?? WickeD
Да, я немного запутался, потому что в примере в вопросе, почему бы не разобрать анализатор строк\\. как\. какое регулярное выражение будет затем анализировать.?
Неважно, только что понял, что я полностью неправильно понял вопрос в первую очередь.
@ametren, это правильно. В первой части замены это действительно \. поскольку он избегает точки, поскольку это также имеет особое значение, так что оно становится "справедливым". который затем заменяется строкой во втором аргументе.
4

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

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

Похожие вопросы