Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > String replaceAll


Автор: Metal_Heart 4.4.2013, 13:22
Обнаружил несколько неприятную особенность в работе String replaceAll(String sres, String sdes)
а именно:
Код

 String s = "\\xd0\\x94\\xd0\\x9b\\xd0\\xaf_\\xd0\\xa0\\xd0\\x95\\xd0\\x90\\xd0\\x9b.\\xd0\\x9e\\xd0\\x91\\xd0\\xaa\\xd0\\x95\\xd0\\x9a\\xd0\\xa2\\xd0\\x9e\\xd0\\x92";
 String sres="\\xd0\\x9e";
 String sdes="@";

 s=s.replaceAll(sres  ,sdes);
 System.out.println("[replaceAll]: "+s);

 while(s.indexOf(sres)>=0){
  s=s.replace(sres ,sdes);
 }
 System.out.println("[replace   ]: "+s);


на выводе имею разный результат:
Код

[replaceAll]: \xd0\x94\xd0\x9b\xd0\xaf_\xd0\xa0\xd0\x95\xd0\x90\xd0\x9b.\xd0\x9e\xd0\x91\xd0\xaa\xd0\x95\xd0\x9a\xd0\xa2\xd0\x9e\xd0\x92
[replace   ]: \xd0\x94\xd0\x9b\xd0\xaf_\xd0\xa0\xd0\x95\xd0\x90\xd0\x9b.@\xd0\x91\xd0\xaa\xd0\x95\xd0\x9a\xd0\xa2@\xd0\x92


Что бы это могло значить?

Автор: Stolzen 4.4.2013, 17:34
В этих символах у вас ничего не понятно.
Между этими двумя методами разница в том, что replace оборачивает параметр replacement в Matcher.quoteReplacement, а replaceAll нет.

Вот док для Matcher.quoteReplacement

Цитата
Returns a literal replacement String for the specified String. This method produces a String that will work as a literal replacement s in the appendReplacement method of the Matcher class. The String produced will match the sequence of characters in s treated as a literal sequence. Slashes ('\') and dollar signs ('$') will be given no special meaning.



Автор: Metal_Heart 5.4.2013, 16:14
Совершенно верно:
Код

    public String replaceAll(String regex, String replacement) {
    return Pattern.compile(regex).matcher(this).replaceAll(replacement);
    }
...
    public String replace(CharSequence target, CharSequence replacement) {
        return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
            this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
    }

используют несколько разный подход к заменам символов, вот только чем это вызвано, т.е. почему?

Автор: Stolzen 5.4.2013, 18:32
Ну если вы хотите в замене ссылаться на группы из регулярки, то вам нужно использовать replaceAll, иначе - replace.
Хотя конечно они могли бы и по-удачнее названия для этих методов придумать. 

Автор: Metal_Heart 8.4.2013, 14:22
ну, да.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)