replace () и replaceAll () в Java
следующий код использует replace() метод String класс на Java.
String a = "abc/xyz";
System.out.println(a.replace("/", ""));
/ в данной строке a заменяется .
то же самое неправильно, если мы используем replaceAll() способ следующим образом.
System.out.println(a.replaceAll("/", ""));
это вызывает исключение java.lang.StringIndexOutOfBoundsException быть брошенным. Это требует двух дополнительных обратных косых черт как следующее, Так как replaceAll() используется regex, который не в случае с replace() метод.
System.out.println(a.replaceAll("/", "\"));
единственный вопрос в том, почему этот метод используется только с двумя косыми чертами, как это a.replaceAll("/", "") бросить java.lang.StringIndexOutOfBoundsException?
на split() метод, с другой стороны, первоначально выдает waring Invalid regular expression: Unexpected internal error (я использую NetBeans 6.9.1).
String b="abcxyz";
System.out.println(b.split("")[0]+b.split("")[1]); //Issues a warning as specified.
попытка запустить это вызывает исключение java.util.regex.PatternSyntaxException быть брошенным.
так как он использует регулярное выражение, как replaceAll(), это требует четыре обратных Слэша.
System.out.println(b.split("\")[0]+b.split("\")[1]);
почему делает a.replaceAll("/", "\"); как и в предыдущем случае, не выдавать такое предупреждение или такое исключение времени выполнения, даже если оно имеет недопустимый шаблон?
2 ответов
Из Javadoc строку.replaceAll
обратите внимание, что обратные слеши (
\) и знаки доллара ( $ ) в строке замены могут привести к тому, что результаты будут отличаться, чем если бы они рассматривались как литеральная строка замены; см. сопоставление.заменяет. Используйте Matcher.quoteReplacement (java.ленг.String) для подавления специального значения этих символов, если это необходимо.
System.out.println(a.replaceAll("/", Matcher.quoteReplacement("\")));
почему этот метод используется только с двумя косыми чертами, как это а.заменяет("/", "\") бросить Ява.ленг.StringIndexOutOfBoundsException?
как известно, \ является метасимволом в регулярном выражении. Когда вы используете \ в регулярном выражении за ним всегда следует другой символ, например \d or \s.
код java.lang.StringIndexOutOfBoundsException исключение, когда он пытается оценить сама строка шаблона то есть \ и он не находит следующий символ, который является обязательным в данном случае. это не входит в строку аргумента a --> abc / xyz, как он пытается сделать ниже:
if (nextChar == '\') { //<-- \ is read here
cursor++;
//<--Its attempting to read next character and fails
nextChar = replacement.charAt(cursor);
result.append(nextChar);
cursor++;
}