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