Разница между String replace() и replaceAll()



В чем разница между java.ленг.Строку с replace() и replaceAll() методы,
кроме более позднего использования регулярных выражений? Для простых замен, таких как, заменить . С / ,
есть ли разница?

1142   12  

12 ответов:

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

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

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

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

PS:

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

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

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

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

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

replace('.', '\');

вместо:

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

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

и replace() и replaceAll() заменить все вхождения в строке.

примеры

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

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

см. также

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

Регулярные Выражения

String replace(char oldChar, char newChar)

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

String replaceAll(String regex, String replacement

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

  1. как replace (), так и replaceAll () принимает два аргумента и заменяет все вхождения первой подстроки (первого аргумента) в строке на вторую подстроку (второй аргумент).
  2. replace() принимает пару char или charsequence и replaceAll () принимает пару регулярных выражений.
  3. неверно, что replace () работает быстрее, чем 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?"

как указано в ответе 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 () с replaceAll ().

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

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

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

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

//String.replaceAll does not work OK, that's 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 );

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

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

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

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

replace и 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

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

Comments

    Ничего не найдено.