replace () y replaceAll () en Java

El siguiente código utiliza el método replace() de la clase String en Java.

 String a = "abc/xyz"; System.out.println(a.replace("/", "\\")); 

/ en el String dado a se está reemplazando con \ .

Lo mismo está mal, si usamos el método replaceAll() siguiente manera.

 System.out.println(a.replaceAll("/", "\\")); 

Hace que se lance la excepción java.lang.StringIndexOutOfBoundsException . Requiere dos barras invertidas adicionales como las siguientes, ya que replaceAll() usa una expresión regular que no es el caso del método replace() .

 System.out.println(a.replaceAll("/", "\\\\")); 

La única pregunta es ¿por qué este método cuando se usa con solo dos barras como esta a.replaceAll("/", "\\") lanza java.lang.StringIndexOutOfBoundsException ?


Por otra parte, el método split() emite inicialmente una Invalid regular expression: Unexpected internal error válida de advertencia Invalid regular expression: Unexpected internal error (estoy usando NetBeans 6.9.1).

 String b="abc\\xyz"; System.out.println(b.split("\\")[0]+b.split("\\")[1]); //Issues a warning as specified. 

Un bash de ejecutar esto provoca la excepción java.util.regex.PatternSyntaxException .

Dado que utiliza una expresión regular como replaceAll() , requiere cuatro barras diagonales inversas.

 System.out.println(b.split("\\\\")[0]+b.split("\\\\")[1]); 

¿Por qué a.replaceAll("/", "\\\\"); como en el caso anterior, no emita una advertencia o una excepción de tiempo de ejecución, aunque tenga un patrón no válido?

De Javadoc String.replaceAll

Tenga en cuenta que las barras diagonales inversas ( \ ) y los signos de dólar ($) en la cadena de reemplazo pueden hacer que los resultados sean diferentes a los que se trataron como una cadena de reemplazo literal; ver Matcher.replaceAll. Use Matcher.quoteReplacement (java.lang.String) para suprimir el significado especial de estos caracteres, si lo desea.

 System.out.println(a.replaceAll("/", Matcher.quoteReplacement("\\"))); 

¿Por qué este método cuando se usa con solo dos barras como esta a.replaceAll (“/”, “\”) lanza java.lang.StringIndexOutOfBoundsException?

Como ustedes saben, \ es un metacarácter en expresiones regulares. Cuando utiliza \ en expresiones regulares, siempre va seguido de otro carácter, por ejemplo, \d or \s .

Su excepción java.lang.StringIndexOutOfBoundsException llegará cuando intente evaluar la cadena de patrón ITSELF, es decir, \\ y no encuentra el siguiente carácter, que es obligatorio en este caso. Esto no viene en la cadena de argumentos a -> abc / xyz como se intenta hacer a continuación:

 if (nextChar == '\\') { //<-- \\ is read here cursor++; //<--Its attempting to read next character and fails nextChar = replacement.charAt(cursor); result.append(nextChar); cursor++; }