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++;
}