2009-06-26 23 views
12

Devo sostituire \\ con \ in Java. Il codice che sto usando èPerché ottengo una stringa StringIndexOutOfBoundsException quando provo a sostituire `\` con ``?

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

Ma io non so perché si sta gettando StringIndexOutOfBoundsException.

Dice String index out of range: 1

Quale potrebbe essere il motivo? Immagino sia perché il primo argomento replaceAll accetta un pattern. Quale potrebbe essere la possibile soluzione?


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) 

risposta Trovato

asalamon74 postato il codice che ho richiesto, ma non so perché lo ha cancellato. In ogni caso eccolo qui.

C'è uno bug già archiviato nel database dei bug di Java. (Grazie per questo riferimento, asalamon.)

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

Sorprendentemente, sia di ricerca e sostituzione di stringa sono gli stessi :) ma ancora fa quello che ho bisogno.

+0

Inoltre, dovrebbe essere File.separator isnt esso? – Tom

+0

Qual è il risultato della concatenazione dei vari campi che hai? – LB40

+0

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

risposta

1

File.seperator è già stato eseguito l'escape come qualsiasi oggetto stringa, pertanto è necessario eseguirne l'escape due volte.

È necessario solo sfuggire ai valori che si immettono come valori letterali stringa.

17

Uso String.replace invece di replaceAll evitarlo utilizzando un'espressione regolare:

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

Personalmente non vorrei farlo in questo modo anche se - mi piacerebbe creare MyConstants.LOCATION_PATH_FILE come File e poi si potrebbe scrivere:

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

che farà la cosa giusta automaticamente.

+0

Questo era solo un esempio. prendi questo, devo sostituire '\\' con '\' nella stringa "ciao \\ !! \ is \\ that \\\ you"! –

+4

Più si avvicina il tuo esempio alla realtà, più è probabile che tu riceva risposte utili. Tuttavia, l'uso di "sostituzioni" dovrebbe comunque funzionare correttamente. –

0

Sospetto che il problema sia che replaceAll() utilizza espressioni regolari e la barra rovesciata è un carattere di escape nelle espressioni regolari e in Java - potrebbe essere necessario raddoppiare il numero di barre retroverse.

In generale si dovrebbe sempre pubblicare la traccia di stack completa delle eccezioni, è molto più facile diagnosticare il problema in questo modo.

0

Credo che quello che dovete fare è:

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

La stringa espressione regolare è in realtà quattro barre inverse, che è un'espressione regolare che corrisponde due barre rovesciate.

String

La sostituzione deve essere quattro barre come da documentazione di Java, da: http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#replaceAll(java.lang.String)

noti che backslash() e segni di dollaro ($) nella stringa di sostituzione può causare i risultati per essere diverso da quello se fosse trattato come una stringa di sostituzione letterale. I segni del dollaro possono essere trattati come riferimenti alle sottosequenze acquisite come descritto sopra, e le barre retroverse sono usate per sfuggire ai caratteri letterali nella stringa di sostituzione.

8

Beh, ho provato

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)); 

e ottenuto, come previsto

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

cosa si ha realmente bisogno è

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

per ottenere

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

si desidera trovare: \\ (2 barre)
che ha bisogno di essere sfuggito nel regex: \\\\ (4 barre)
e fuggì in Java: "\\\\\\\\" (8 barre)
stesso per la sostituzione ...

-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 == '\\\\')' è un errore di sintassi. Stai cercando di spremere due barre rovesciate in un letterale 'char'. –

1

Prova questo

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

Per l'espressione regolare, se si desidera modificare \ a \\, lo si dovrebbe fare:

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

Dove \\\\ significa \ e \\\\\\\\ significa \\.

1

Il modo migliore è:

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