В чем разница между java.lang.String replace()
и replaceAll()
методами, за исключением того, что позже используется регулярное выражение? Для простых замен, таких как, заменить .
на /
, есть ли разница?
221
В java.lang.String
, то replace
метод либо берет пару Чары или пару CharSequence
«s (из которых строка является подклассом, так что это будет счастливо взять пару струны). replace
Метод заменит все вхождения полукокса или CharSequence
. С другой стороны, оба String
аргумента replaceFirst
и replaceAll
регулярные выражения (регулярное выражение). Использование неправильной функции может привести к незначительным ошибкам.
str.replaceAll(regex, repl)
такой же, какPattern.compile(regex).matcher(str).replaceAll(repl)
. Таким образом, есть большие накладные расходы в зависимости от того, сколько он используется.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
.Пример 2
Заменить все вхождения строки
fish
наsheep
.replaceAll()
Используйте,
replaceAll()
если вы хотите использовать шаблон регулярного выражения .Пример 3
Заменить любое число на
x
.Пример 4
Удалить все пробелы.
Смотрите также
Документация
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()
.Например, для простых замен, как вы упомянули, лучше использовать:
вместо того:
Примечание: приведенные выше аргументы метода преобразования зависят от системы.
источник
Pattern.compile(...)
в своих реализациях, контент / часть кажетсяreplace
менее сложным в том, как определить / отправить первый аргумент. Не требует"\"
. Кроме тогоreplace
, доступно с Java1.5
иreplaceAll
с тех пор1.4
Возвращает новую строку, полученную в результате замены всех вхождений oldChar в этой строке на newChar.
Заменяет каждую подстроку этой строки, которая соответствует данному регулярному выражению с данной заменой.
источник
Это не правда, что replace () работает быстрее, чем replaceAll (), так как оба используют один и тот же код в своей реализации
Pattern.compile (регулярное выражение) .matcher (это) .replaceAll (замена);
Теперь вопрос в том, когда использовать замену, а когда использовать replaceAll (). Если вы хотите заменить подстроку на другую подстроку независимо от места ее появления в строке, используйте replace (). Но если у вас есть какое-то конкретное предпочтение или условие типа замены только тех подстрок в начале или конце строки, используйте replaceAll (). Вот несколько примеров, чтобы доказать мою точку зрения:
источник
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] будут иметь одинаковое значение, но они различны.
Выход этого:
Это отличается от Perl, где замена не требует дополнительного уровня экранирования:
который печатает \ X 2
Это может быть довольно неприятно, например, при попытке использовать значение, возвращаемое java.sql.DatabaseMetaData.getSearchStringEscape () с replaceAll ().
источник
Старый поток я знаю, но я новичок в Java и обнаружил одну из странных вещей. я использовал
String.replaceAll()
но получаю непредсказуемые результаты.Что-то вроде этого портит строку:
Поэтому я разработал эту функцию, чтобы обойти странную проблему:
Что позволяет вам делать:
источник
String.replaceAll()
ожидает регулярных выражений, а не буквальных аргументов, поэтому вы получаете «непредсказуемые» (которые на самом деле очень предсказуемые) результаты.String.replace()
работает так, как вы хотите.Добавление к уже выбранному «Лучшему ответу» (и другим, которые так же хороши, как у Сурагча),
String.replace()
ограничено заменой последовательных символов (таким образом, принимаяCharSequence
). ОднакоString.replaceAll()
не ограничивается заменой только последовательных символов. Вы можете заменить непоследовательные символы, если ваше регулярное выражение построено таким образом.Также (что наиболее важно и мучительно очевидно)
replace()
может заменить только буквальные значения; тогда какreplaceAll
может заменить «похожие» последовательности (не обязательно идентичные).источник
replace()
Метод не использует шаблон регулярных выражений, тогда какreplaceAll()
метод использует шаблон регулярных выражений. Такreplace()
работает быстрее чемreplaceAll()
.источник
replace работает с типом данных char, но replaceAll работает с типом данных String, и оба заменяют все вхождения первого аргумента вторым аргументом.
источник