Разница между строкой replace() и replaceAll()

Какая разница между методами java.lang.String replace() и replaceAll() кроме последующего использования regex? Для простых подстановок, например, замените . на /, есть ли разница?

Ответ 1

В java.lang.String метод replace либо принимает пару char, либо пару CharSequence (из которых String является подклассом, поэтому он с удовольствием возьмет пару строк). Метод replace заменит все вхождения char или CharSequence. С другой стороны, оба аргумента String для replaceFirst и replaceAll являются регулярными выражениями (regex). Использование неправильной функции может привести к тонким ошибкам.

Ответ 2

Q: Какая разница между методами java.lang.String replace() и replaceAll(), кроме того, что в дальнейшем используется регулярное выражение.

A: Просто регулярное выражение. Они оба заменяют все:)

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

PS:

Также существует replaceFirst() (который принимает регулярное выражение)

Ответ 3

Метод replace() перегружен, чтобы принимать как примитивные аргументы char, так и CharSequence в качестве аргументов.

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

Так как мы знаем, что сопоставление шаблонов регулярных выражений является немного более сложным и, следовательно, медленнее, тогда предпочтительнее replace() over replaceAll().

Например, для простых подстановок, как вы упомянули, лучше использовать:

replace('.', '\\');

вместо:

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

Примечание: приведенные выше аргументы метода преобразования зависят от системы.

Ответ 4

И replace() и replaceAll() заменяют все вхождения в String.

Примеры

Я всегда нахожу примеры полезными для понимания различий.

replace()

Используйте replace() если вы просто хотите заменить некоторый char другим char или некоторой String другой String (на самом деле CharSequence).

Пример 1

Замените все вхождения символа x на o.

String myString = "__x___x___x_x____xx_";

char oldChar = 'x';
char newChar = 'o';

String newString = myString.replace(oldChar, newChar);
// __o___o___o_o____oo_

Пример 2.

Замените все вхождения струнной fish sheep.

String myString = "one fish, two fish, three fish";

String target = "fish";
String replacement = "sheep";

String newString = myString.replace(target, replacement);
// one sheep, two sheep, three sheep

replaceAll()

Используйте replaceAll() если вы хотите использовать шаблон регулярного выражения.

Пример 3.

Замените любое число на x.

String myString = "__1_6____3__6_345____0";

String regex = "\\d";
String replacement = "x";

String newString = myString.replaceAll(regex, replacement); 
// __x_x____x__x_xxx____x

Пример 4.

Удалите все пробелы.

String myString = "   Horse         Cow\n\n   \r Camel \t\t Sheep \n Goat        ";

String regex = "\\s";
String replacement = "";

String newString = myString.replaceAll(regex, replacement); 
// HorseCowCamelSheepGoat

Смотрите также

Документация

Обычные выражения

Ответ 5

String replace(char oldChar, char newChar)

Возвращает новую строку в результате замены всех вхождений oldChar в этой строке с помощью newChar.

String replaceAll(String regex, String replacement

Заменяет каждую подстроку этой строки, которая соответствует данному регулярному выражению с указанной заменой.

Ответ 6

  • Оба replace() и replaceAll() принимают два аргумента и заменяют все вхождения первой подстроки (первый аргумент) в строке со второй подстрокой (второй аргумент).
  • replace() принимает пару char или charsequence, а replaceAll() принимает пару регулярных выражений.
  • Неверно, что replace() работает быстрее, чем replaceAll(), поскольку оба используют один и тот же код в своей реализации

    Pattern.compile(регулярное выражение).matcher(это).replaceAll(замена);

Теперь возникает вопрос, когда использовать replace и когда использовать replaceAll(). Если вы хотите заменить подстроку на другую подстроку, независимо от места ее появления в строке, используйте replace(). Но если у вас есть определенные предпочтения или условия, такие как замена только тех подстрок в начале или конце строки, используйте replaceAll(). Вот несколько примеров, подтверждающих мою мысль:

String str = new String("==qwerty==").replaceAll("^==", "?"); \\str: "?qwerty=="
String str = new String("==qwerty==").replaceAll("==$", "?"); \\str: "==qwerty?"
String str = new String("===qwerty==").replaceAll("(=)+", "?"); \\str: "?qwerty?"

Ответ 7

Как указано в ответе wickeD, с replaceAll строка замены обрабатывается по-разному между replace и replaceAll. Я ожидал, что [3] и [4] будут иметь одинаковое значение, но они разные.

public static void main(String[] args) {
    String[] a = new String[5];
    a[0] = "\\";
    a[1] = "X";
    a[2] = a[0] + a[1];
    a[3] = a[1].replaceAll("X", a[0] + "X");
    a[4] = a[1].replace("X", a[0] + "X");

    for (String s : a) {
        System.out.println(s + "\t" + s.length());
    }
}

Результат этого:

\   1
X   1
\X  2
X   1
\X  2

Это отличается от perl, где замена не требует дополнительного уровня экранирования:

#!/bin/perl
$esc = "\\";
$s = "X";

$s =~ s/X/${esc}X/;
print "$s " . length($s) . "\n";

который печатает \ X 2

Это может быть довольно неприятным, так как при попытке использовать значение, возвращаемое java.sql.DatabaseMetaData.getSearchStringEscape() с заменойAll().

Ответ 8

Старый поток, который я знаю, но я как бы новичок в Java и обнаруживаю одно из его странных вещей. Я использовал String.replaceAll(), но получаю непредсказуемые результаты.

Что-то вроде этого испортит строку:

sUrl = sUrl.replaceAll( "./", "//").replaceAll( "//", "/");

Итак, я разработал эту функцию, чтобы обойти эту странную проблему:

//String.replaceAll does not work OK, that why this function is here
public String strReplace( String s1, String s2, String s ) 
{
    if((( s == null ) || (s.length() == 0 )) || (( s1 == null ) || (s1.length() == 0 )))
     { return s; }

   while( (s != null) && (s.indexOf( s1 ) >= 0) )
    { s = s.replace( s1, s2 ); }
  return s;
}

Что вы можете сделать:

sUrl=this.strReplace("./", "//", sUrl );
sUrl=this.strReplace( "//", "/", sUrl );

Ответ 9

В Java существует два метода replace(), один из которых принимает символ как первый параметр, а другой принимает CharSequence (который является супер интерфейсом для String, Stringbuffer и т.д.) В качестве первого параметра. Оба этих метода заменяют все вхождения char или CharSequence значением, которое вы предоставляете во втором параметре.

Метод ReplaceAll принимает регулярное выражение как первый параметр, поэтому вам нужно дать ему некоторое Regex, и совпадающее содержимое будет заменено строкой, переданной во втором параметре.

Для полной разницы между методом replace() и replaceAll() вы можете ссылаться здесь. Разница между методами replace(), replaceAll() и replaceFirst() в Java String

Ответ 10

replace() метод не использует шаблон regex, тогда как метод replaceAll() использует шаблон регулярного выражения. Поэтому replace() выполняется быстрее, чем replaceAll().

Ответ 11

replace and replaceAll меняет string и char во всех словах, но replaceAll поддерживает регулярное выражение (регулярное выражение). Существует также replaceFirst которая похожа на replaceAll на то, что они поддерживают регулярное выражение, а также строки изменения и символы, разница между ними заключается в том, что при использовании replaceFirst с регулярным выражением он заменяет первое регулярное выражение ТОЛЬКО.

// Java_codes_for_more_explanation ; 

String name1 = "Omar Ahmed Hafez" ;

name1 = name1.replace("Omar", "Ahmed");

System.out.println(name1);

/////////////////////////////////////////////

String name2 = "Omar Ahmed Hafez" ;

name2 = name2.replaceAll("\\s", "-");

// The first parameter("\\W") is regex and it mean replace #ALL
// space by "-" and it change All regex in the line as its replaceALL

System.out.println(name2);

////////////////////////////////////////////

String name3 = "Omar Ahmed Hafez" ;

name3 = name3.replaceFirst ("\\s", "-");

// The first parameter("\\W") is regex and it mean replace #FIRST
// space ONLT by "-" (as //it replaceFirst so it replace the first
// regex only :)  

System.out.println(name3);

И вывод:

Ahmed Ahmed Hafez

Omar-Ahmed-Hafez

Ответ 12

заменить работы на тип данных char, но replaceAll работает с типом данных String и заменяет все вхождения первого аргумента вторым аргументом.