2012-06-04 4 views
3

Я пытаюсь следующий код: -Ошибка в функции String.replaceAll()

String x = "asdfg/dgws"; 
x.replaceAll("/", "\\"); 

Но это не удается. Это дает мне следующее сообщение об ошибке: -

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1 
    at java.lang.String.charAt(Unknown Source) 
    at java.util.regex.Matcher.appendReplacement(Unknown Source) 
    at java.util.regex.Matcher.replaceAll(Unknown Source) 
    at java.lang.String.replaceAll(Unknown Source) 
    at com.jai.SecLargest.main(SecLargest.java:13) 

Я не могу понять, почему это исключение приходит?

ответ

20

String.replaceAll заканчивается использованием (или быть эквивалентно использованию) Matcher.replaceAll, которая включает в себя это в документации:

Обратите внимание, что обратная косая черта() и знак доллара ($) в строке замены могут привести результаты к быть отличным, чем если бы он рассматривался как буквальная строка замены. Знаки доллара могут рассматриваться как ссылки на захваченные подпоследовательности, как описано выше, а обратные косые черты используются для исключения буквенных символов в заменяющей строке.

В то время как вы могли обратный слеш как в ответ AlexR, я бы настоятельно рекомендуем вам использовать replace вместо:

String y = x.replace('/', '\\'); 

Это намного яснее, IMO - не используйте replaceAll, если вам 're действительно пытается, чтобы выразить шаблон с помощью регулярных выражений.

Также обратите внимание, что , как написано, ваш код был бы не-оператором; строки неизменны в Java, поэтому метод replaceAll (и аналогичный) возвращает ссылку на строку с внесенными изменениями.

+1

Большое спасибо skeet :) – Jaguar

8

Вы должны сказать x.replaceAll("/", "\\\\");

Назад слэш \ должны быть экранированы дважды: один раз регулярных выражений двигателя и один раз для самой Java.

0

Вы также можете использовать метод quoteReplacement(), если вам действительно нужно регулярное выражение.