Какая разница между методами java.lang.String replace()
и replaceAll()
кроме последующего использования regex? Для простых подстановок, например, замените .
на /
,
есть ли разница?
Разница между строкой replace() и replaceAll()
Ответ 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
Смотрите также
Документация
-
replace(char oldChar, char newChar)
-
replace(CharSequence target, CharSequence replacement)
-
replaceAll(String regex, String replacement)
-
replaceFirst(String regex, String replacement)
Обычные выражения
Ответ 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 и заменяет все вхождения первого аргумента вторым аргументом.