2009-06-26 12 views
12

Muszę zastąpić \\ przez \ w Javie. Kod używam jestDlaczego otrzymuję wyjątek StringIndexOutOfBoundsException, gdy próbuję zastąpić `\` z ` '?

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

Ale nie wiem, dlaczego to jest rzucanie StringIndexOutOfBoundsException.

Mówi String index out of range: 1

Co może być przyczyną? Chyba dlatego, że pierwszy argument akceptuje wzorzec. Jakie może być możliwe rozwiązanie?


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) 

Odpowiedź Znaleziony

asalamon74 pisał kod I wymagane, ale nie wiem dlaczego on usunął go. W każdym razie tutaj jest.

Istnieje już bug zapisane w bazie danych błędów Javy. (Dzięki za odniesienie, asalamon.)

Co ciekawe, zarówno wyszukiwanie, jak i zamiana stringów są takie same :), ale wciąż robi to, czego wymagam.

+0

Również należy File.separator isnt to? – Tom

+0

Jaki jest wynik łączenia różnych pól, które posiadasz? – LB40

+0

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

Odpowiedz

1

File.seperator już uciekł, podobnie jak każdy obiekt typu string, więc uciekasz dwukrotnie.

Trzeba tylko unikać wartości, które wpisujesz jako literał łańcuchowy.

17

Zastosowanie String.replace zamiast replaceAll unikać jej za pomocą wyrażenia regularnego:

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

Osobiście nie byłoby to zrobić w ten sposób choć - Chciałbym stworzyć MyConstants.LOCATION_PATH_FILE jako File a następnie można napisać:

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

który zrobi to, co trzeba automatycznie.

+0

To był tylko przykład. weź to, muszę zastąpić "\\" przez "\" w ciągu "hello \\ !! \ is \\ that \\\\ you"! –

+4

Im bardziej zbliżasz swój przykład do rzeczywistości, tym bardziej prawdopodobne jest uzyskanie pomocnych odpowiedzi. Jednak użycie tylko "zamień" powinno nadal działać dobrze. –

0

Podejrzewam, że problem polega na tym, że replaceAll() używa wyrażeń regularnych, a ukośnik odwrotny jest znakiem escape w wyrażeniach regularnych, a także w języku Java - może być konieczne podwojenie liczby ukośników odwrotnych.

Generalnie powinieneś zawsze zamieścić pełne stosy wyjątków, znacznie łatwiej jest zdiagnozować problem w ten sposób.

0

wierzę, co trzeba zrobić, to:

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

Regularne String wyrażenie jest rzeczywiście cztery backslashe, który jest wyrażeniem regularnym dopasowującym dwa odwrotne ukośniki.

Zastąpienie String musi być cztery ukośniki, jak na dokumentacji Java, from: http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#replaceAll(java.lang.String)

Zauważ, że ukośniki() i znaki dolara ($) w ciągu zastępowania może spowodować, że wyniki będą się różnić od jeśli był traktowany jako literalny ciąg zastępczy. Znaki dolara mogą być traktowane jako odniesienia do wychwyconych podciągów, jak opisano powyżej, a ukośniki odwrotne są używane do uniknięcia literalnych znaków w ciągu zastępczym.

8

Cóż, próbowałem

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

i dostał, jak oczekiwano

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

Co naprawdę potrzeba jest

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

dostać

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

Chcesz znaleźć: \\ (2 ukośniki)
który musi być uciekł w regex: \\\\ (4 ukośniki)
i uciekł w Javie: "\\\\\\\\" (8 ukośniki)
samo zastąpienie ...

-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 == '\\\\')' jest błędem składni. Próbujesz wycisnąć dwa odwrócone ukośniki w jeden literał "char". –

1

Spróbuj

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

Dla regex, jeśli chcesz zmienić \ do \\, należy to zrobić:

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

Gdzie \\\\ oznacza \ i \\\\\\\\ oznacza \\.

1

Najlepszym sposobem jest:

str.replace(**'**\\**'**, **'**/**'**); //with char method not String 
Powiązane problemy