2009-06-26 32 views
12

Tengo que reemplazar \\ con \ en Java. El código que estoy utilizando es¿Por qué recibo StringIndexOutOfBoundsException cuando trato de reemplazar `\` con ``?

System.out.println((MyConstants.LOCATION_PATH + File.separator + myObject.getStLocation()).replaceAll("\\\\", "\\")); 

Pero no sé por qué se está lanzando StringIndexOutOfBoundsException.

Dice String index out of range: 1

Cuál podría ser la razón? Supongo que es porque el primer argumento replaceAll acepta un patrón. ¿Cuál podría ser la posible solución?


StackTrace

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1 
    at java.lang.String.charAt(String.java:558) 
    at java.util.regex.Matcher.appendReplacement(Matcher.java:696) 
    at java.util.regex.Matcher.replaceAll(Matcher.java:806) 
    at java.lang.String.replaceAll(String.java:2000) 

respuesta encontrado

asalamon74 publicado el código que necesitaba, pero no sé por qué se borró. En cualquier caso aquí está.

Hay un bug ya archivado en la base de datos de errores de Java. (Gracias por esta referencia, asalamon.)

yourString.replaceAll("\\\\", "\\\\"); 

Sorprendentemente, tanto de buscar y reemplazar cadena son los mismos :) pero todavía lo hace lo que requiero.

+0

Además, cabe File.separator no creen? – Tom

+0

¿Cuál es el resultado de la concatenación de los diversos campos que tiene? – LB40

+0

@LB c: \\ myDoc \\ hell \ o.txt –

Respuesta

1

File.seperator ya se ha escapado como cualquier objeto de cadena, por lo que se está escapando dos veces.

Solo necesita escapar los valores que está ingresando como un literal de cadena.

17

Uso String.replace en lugar de replaceAll para evitar que el uso de una expresión regular:

String original = MyConstants.LOCATION_PATH + File.seperator 
    + myObject.getStLocation(); 
System.out.println(original.replace("\\\\", "\\")); 

Personalmente no hacerlo de esta manera sin embargo - que crearía MyConstants.LOCATION_PATH_FILE como File y luego se podría escribir:

File location = new File(MyConstants.LOCATION_PATH_FILE, 
         myObject.getStLocation()); 

que hará lo correcto automáticamente.

+0

Eso fue solo un ejemplo. toma esto, tengo que reemplazar '\\' con '\' en la cadena "hola \\ !! \ es \\ ese \\\\ you"! –

+4

Cuanto más cerca pueda dar su ejemplo a la realidad, más probabilidades tendrá de obtener respuestas útiles. Sin embargo, el uso de simplemente "reemplazar" debería funcionar bien. –

0

Sospecho que el problema es que replaceAll() usa expresiones regulares y la barra diagonal inversa es un carácter de escape tanto en expresiones regulares como en Java; puede que sea necesario duplicar el número de barras diagonales inversas.

En general, siempre se debe publicar el rastro de la pila completa de excepciones, es mucho más fácil diagnosticar el problema de esa manera.

0

Creo que lo que hay que hacer es:

System.out.println((MyConstants.LOCATION_PATH + File.separator + myObject.getStLocation()).replaceAll("\\\\\\\\", "\\\\")); 

La cadena de expresión regular es en realidad cuatro barras invertidas, lo que es una expresión regular que coincide con dos barras invertidas.

cadena

La sustitución tiene que ser cuatro barras como por la documentación de Java, a partir de: http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#replaceAll(java.lang.String)

Tenga en cuenta que las barras invertidas() y signos de dólar ($) en la cadena de reemplazo pueden causar que los resultados sean diferentes a si se tratara como una cadena de reemplazo literal. Los signos de dólar se pueden tratar como referencias a subsequences capturadas como se describió anteriormente, y las barras diagonales inversas se usan para escapar caracteres literales en la cadena de reemplazo.

8

bueno, lo intente

String test = "just a \\ test with some \\\\ and others \\\\ or \\ so"; 
    String result = test.replaceAll("\\\\", "\\\\"); 
    System.out.println(test); 
    System.out.println(result); 
    System.out.println(test.equals(result)); 

y consiguió, como se esperaba

just a \ test with some \\ and others \\ or \ so 
just a \ test with some \\ and others \\ or \ so 
true 

Lo que realmente necesidad es

string.replaceAll("\\\\\\\\", "\\\\"); 

para obtener

just a \ test with some \\ and others \\ or \ so 
just a \ test with some \ and others \ or \ so 
false 

piensa que no hay: \\ (2 barras)
que hay que escaparon de la expresión regular: \\\\ (4 barras)
y escaparon en Java: "\\\\\\\\" (8 barras)
mismo para la sustitución ...

-2
final StringBuilder result = new StringBuilder(); 
final StringCharacterIterator iterator = new StringCharacterIterator(str); 
char character = iterator.current(); 
while (character != CharacterIterator.DONE) 
{ 
    if (character == '\\\\') { 
    result.append("\\"); 
    } 
    else { 
    result.append(character); 
    } 

    character = iterator.next(); 
} 

System.out.print(result); 
+2

'if (character == '\\\\')' es un error de sintaxis. Estás tratando de meter dos barras invertidas en un literal 'char'. –

1

Prueba este

cadena.replaceAll("\\\\","\\\\\\\\") 
2

Por la expresión regular, si usted quiere cambiar a \\\, usted debe hacer esto:

if (str.indexOf('\\') > -1) 
    str = str.replaceAll("\\\\", "\\\\\\\\"); 
str = "\"" + str + "\""; 

Dónde \\\\ significa \ y \\\\\\\\ significa \\.

1

La mejor manera es:

str.replace(**'**\\**'**, **'**/**'**); //with char method not String 
Cuestiones relacionadas