Ответы:
В java.lang.String
, то replace
метод либо берет пару Чары или пару CharSequence
«s (из которых строка является подклассом, так что это будет счастливо взять пару струны). replace
Метод заменит все вхождения полукокса или CharSequence
. С другой стороны, оба String
аргумента replaceFirst
и replaceAll
регулярные выражения (регулярное выражение). Использование неправильной функции может привести к незначительным ошибкам.
String#replace(target, replacement)
делает то же самое, за исключением того, что цитирует строки: Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
есть ли какая-то причина, почему String#replace
это будет быстрее, чем String#replaceAll
? Казалось бы, это не так, поскольку String#replace
просто выполняет дополнительные операции.
replaceAll
. Ответ больше оreplace
Q: В чем разница между java.lang.String
методами replace()
и replaceAll()
, кроме того, что позже используется регулярное выражение?
A: Просто регулярное выражение. Они оба заменяют все :)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
PS:
Там также replaceFirst()
(который принимает регулярное выражение)
CharSequence
есть. Оба replace()
и replaceAll()
"работают с CharSequence
". Это то, что replaceAll()
рассматривает данное CharSequence
как регулярное выражение, поэтому оно ищет совпадения с регулярным выражением , в то время как replace()
рассматривает данное CharSequence
как обычный текст поиска, поэтому оно ищет его вхождения .
Обе 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)
Регулярные выражения
replace()
Метод перегружен , чтобы принять как примитивный char
и в CharSequence
качестве аргументов.
Теперь, что касается производительности, replace()
метод немного быстрее, чемreplaceAll()
тот, который последний сначала компилирует шаблон регулярного выражения, а затем сопоставляет его перед окончательной заменой, тогда как первый просто сопоставляет предоставленный аргумент и заменяет.
Поскольку мы знаем, что сопоставление с образцом регулярных выражений немного сложнее и, следовательно, медленнее, тогда, когда это возможно, предлагается предпочтение replace()
перед replaceAll()
.
Например, для простых замен, как вы упомянули, лучше использовать:
replace('.', '\\');
вместо того:
replaceAll("\\.", "\\\\");
Примечание: приведенные выше аргументы метода преобразования зависят от системы.
Pattern.compile(...)
в своих реализациях, контент / часть кажется replace
менее сложным в том, как определить / отправить первый аргумент. Не требует "\"
. Кроме того replace
, доступно с Java 1.5
и replaceAll
с тех пор1.4
String replace(char oldChar, char newChar)
Возвращает новую строку, полученную в результате замены всех вхождений oldChar в этой строке на newChar.
String replaceAll(String regex, String replacement
Заменяет каждую подстроку этой строки, которая соответствует данному регулярному выражению с данной заменой.
Это не правда, что replace () работает быстрее, чем replaceAll (), так как оба используют один и тот же код в своей реализации
Pattern.compile (регулярное выражение) .matcher (это) .replaceAll (замена);
Теперь вопрос в том, когда использовать замену, а когда использовать 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?"
replace
не звонит Pattern.compile(regex).matcher(this).replaceAll(replacement);
. Он звонитPattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
Как упоминалось в ответе 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 );
String.replaceAll()
ожидает регулярных выражений, а не буквальных аргументов, поэтому вы получаете «непредсказуемые» (которые на самом деле очень предсказуемые) результаты. String.replace()
работает так, как вы хотите.
Добавление к уже выбранному «Лучшему ответу» (и другим, которые так же хороши, как у Сурагча), String.replace()
ограничено заменой последовательных символов (таким образом, принимая CharSequence
). Однако String.replaceAll()
не ограничивается заменой только последовательных символов. Вы можете заменить непоследовательные символы, если ваше регулярное выражение построено таким образом.
Также (что наиболее важно и мучительно очевидно) replace()
может заменить только буквальные значения; тогда как replaceAll
может заменить «похожие» последовательности (не обязательно идентичные).
replace()
Метод не использует шаблон регулярных выражений, тогда как replaceAll()
метод использует шаблон регулярных выражений. Так replace()
работает быстрее чем replaceAll()
.
replace работает с типом данных char, но replaceAll работает с типом данных String, и оба заменяют все вхождения первого аргумента вторым аргументом.
str.replaceAll(regex, repl)
такой же, какPattern.compile(regex).matcher(str).replaceAll(repl)
. Таким образом, есть большие накладные расходы в зависимости от того, сколько он используется.