Во -первых, давайте обобфрим использование трех из них:
・ Замените (цель ChargeSequence, замена последовательности) , замените все цели на замену, оба параметра являются строками.
・ Замена (строковая переключение, замена строки) , замените все совпадения режима режима на замену. Руководитель, очевидно, является регулярным выражением, замена - это строка.
・ Replyfirst (строковое перепонку, замена строки) , которая в основном совпадает с заменой, разница в том, что заменяется только первый матч.
Далее, есть простое требование, которое должно заменить A в исходной строке на /a, код заключается в следующем:
System.out.println ("abac" .replace ("a", "// a")); ///ab/acsystem.out.println("abac".replaceall("a "," // a ")); //abacsystem.out.println("abac".replacefirst("a "," // a ")); //abacsystem.out.println("abac".replacefirst("a "," // a ")); // abacРезультат был большим сюрпризом. После стольких лет замены я был немного смущен.
Строка источника - «ABAC», а затем мы находим «A», замените ее /a. Поскольку /это персонаж Java Escape, если вы хотите выразить /a, вы должны написать «// a», первая обратная черта ускользает от второй обратной сшивки в обычную строку.
С тремя выражениями замены, только результат первой функции замены является правильным. В чем проблема?
Замена и замены First требуют, чтобы первый параметр был регулярным выражением. «A» может быть понят как как строка A, так и регулярное выражение A, поэтому первый параметр в порядке.
Проблема заключается во втором параметре. Если читатели тщательно прочитают комментарии функции замены, они найдут следующее объяснение:
Обратите внимание, что обратные сшивки (/) и долларовые знаки ($) в запасной строке могут привести к тому, что результаты отличаются от того, если они рассматриваются как буквальная заменяющая строка; Смотрите Matcher.Replaceall. Используйте java.util.regex.matcher.quotereplacement, чтобы подавить особое значение этих символов, при желании.
Поскольку первый параметр замены и замены FIRST является регулярным, мы можем сделать несколько небольших уловок во втором параметре, например, требование: замените A в исходной строке с символом сразу же после A, код выглядит следующим образом:
System.out.println ("abac" .replaceall ("a (// w)", "$ 1 $ 1")); //bbccsystem.out.println("abac".replacefirst("a(//w) "," $ 1 $ 1 ")); // bbacПредположим, что значение регулярности может быть понято читателем, можно видеть, что во втором параметре можно использовать символ $ для получения содержания группы. В этом примере 1 долл. США используется для получения содержания первой группы, то есть символа сразу же после a.
Следовательно, символ $ имеет особое значение во втором параметре, и написание его случайным образом вызовет ошибку:
System.out.println ("abac" .replaceall ("a (// w)", "$")); // Исключение в потоке "Main" java.lang.stringindexoutofboundsexception: String Index вне диапазона: 1Что если я просто хочу заменить его на $? Это требует убегающих персонажей:
System.out.println ("abac" .replaceall ("a", "// $")); // $ b $ cНа этом этапе читатели могут внезапно понять, что Backslash также имеет особое значение (сбежал) во втором параметре, поэтому, если мы хотим выразить Backslash, мы должны снова избежать его:
System.out.println ("abac" .replaceall ("a", "//// a")); ///ab/acsystem.out.println("abac".replacefirst("a "," ///// A ")); /// ABACЧтобы кратко понять, передняя спинка в «//// A» впоследствии ускользает от Backslash, так что Backslash впоследствии является обычной строкой. Таким образом, строка, видимая в памяти Java, "// A". При обработке функция ReplaceAlel использует переднюю обратную линию, чтобы сбежать от BackSlash после этого, чтобы выразить, что BackSlash впоследствии является обычной строкой, которая не используется для ухода за $, а окончательная строка в памяти - « /A», так что A может быть успешно заменена на /a.
Суммировать
Проблема побега действительно запутана. Благодаря этой статье автор надеется, что читатели смогут не бодрствовать при использовании этих функций в будущем, будьте в курсе особых символов в параметрах и избегать написания бомб. Вышеуказанное - все содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения и работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.