2009-06-26 16 views
12

Ich muss \\ durch \ in Java ersetzen. Der Code, den ich verwende, istWarum erhalte ich eine StringIndexOutOfBoundsException, wenn ich versuche, `\` durch `` zu ersetzen?

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

Aber ich weiß nicht, warum es StringIndexOutOfBoundsException werfen.

Es sagt String index out of range: 1

Was könnte der Grund sein? Ich denke, das liegt daran, dass das erste Argument replaceAll ein Muster akzeptiert. Was könnte die mögliche Lösung sein?


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) 

Antwort gefunden

asalamon74 den Code habe ich geschrieben erforderlich, aber ich weiß nicht, warum er es gelöscht. In jedem Fall ist es hier.

Es ist ein bug bereits in Javas Bug-Datenbank abgelegt. (Danke für diesen Hinweis, asalamon.)

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

Erstaunlicherweise sowohl zum Suchen und Ersetzen-String ist die gleiche :) aber immer noch tut es das, was ich brauche.

+0

Auch sollte es File.separator es ist nicht sein? – Tom

+0

Was ist das Ergebnis der Verkettung der verschiedenen Felder, die Sie haben? – LB40

+0

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

Antwort

1

File.seperator ist bereits wie jedes String-Objekt bereits maskiert, so dass Sie zweimal entkommen.

Sie müssen nur Werte, die Sie als Zeichenfolgenliteral eingegeben haben, ausschließen.

17

Verwenden String.replace statt replaceAll zu vermeiden, ist es eine Regex:

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

Persönlich würde ich es aber auf diese Weise nicht tun - ich MyConstants.LOCATION_PATH_FILE als File schaffen würde und dann könnte man schreiben:

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

das wird das Richtige automatisch tun.

+0

Das war nur ein Beispiel. Nimm das, ich muss "\\" durch "\" in der Zeichenfolge "Hallo \\ !! \ ist \\ das \" ersetzen! –

+4

Je näher Sie Ihr Beispiel zur Realität machen können, desto eher erhalten Sie hilfreiche Antworten. Die Verwendung von "Ersetzen" sollte jedoch noch gut funktionieren. –

0

Ich vermute, das Problem ist, dass replaceAll() Regexps verwendet und der Backslash ein Escape-Zeichen in Regexps sowie in Java ist - es könnte notwendig sein, die Anzahl der Backslashes zu verdoppeln.

Im Allgemeinen sollten Sie immer die vollständige Stack-Ablaufverfolgung von Ausnahmen buchen, es ist viel einfacher, das Problem auf diese Weise zu diagnostizieren.

0

glaube ich, was Sie tun müssen, ist:

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

Der reguläre Ausdruck String ist eigentlich vier Schrägstriche, die ein regulärer Ausdruck ist, die zwei Schrägstriche übereinstimmt.

Der Ersatz String hat vier Schrägstriche als pro Java-Dokumentation sein, ab: http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#replaceAll(java.lang.String)

Beachten Sie, dass Schrägstriche() und Dollarzeichen ($) in der Ersatzzeichenfolge der Ergebnisse führen können, anders sein als wenn es als literale Ersatzzeichenfolge behandelt würde. Dollarzeichen können wie oben beschrieben als Verweise auf erfasste Untersequenzen behandelt werden, und Backslashes werden verwendet, um Literalzeichen in der Ersetzungszeichenfolge zu umgehen.

8

Nun, habe ich versucht,

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

und bekam, wie

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

Was Sie wirklich Notwendigkeit ist

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

zu bekommen

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

Sie wollen finden: \\ (2 Schrägstriche)
, die in der regex entkam werden muss: \\\\ (4 Schrägstriche)
und entkam in Java: "\\\\\\\\" (8 Schrägstriche)
gleiche gilt für den Ersatz ...

-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 == '\\\\')' ist ein Syntaxfehler. Sie versuchen, zwei umgekehrte Schrägstriche in ein char-Literal zu drücken. –

1

Versuchen Sie, diese

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

Für die regex, wenn Sie \ zu \\ ändern möchten, sollten Sie dies tun:

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

Wo \\\\ bedeutet \ und \\\\\\\\ bedeutet \\.

1

Der beste Weg ist:

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