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()overreplaceAll()рекомендуется, когда это возможно.например, для простых замен, как вы упомянули, лучше использовать:
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см. также
документация
replace(char oldChar, char newChar)replace(CharSequence target, CharSequence replacement)replaceAll(String regex, String replacement)replaceFirst(String regex, String replacement)Регулярные Выражения
String replace(char oldChar, char newChar)возвращает новую строку, полученную в результате замены всех вхождений oldChar в этой строке на newChar.
String replaceAll(String regex, String replacementзаменяет каждую подстроку этой строки, которая соответствует заданному регулярному выражению с данной заменой.
- как replace (), так и replaceAll () принимает два аргумента и заменяет все вхождения первой подстроки (первого аргумента) в строке на вторую подстроку (второй аргумент).
- replace() принимает пару char или charsequence и replaceAll () принимает пару регулярных выражений.
неверно, что 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