String.replaceAll без RegEx


116

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


Ответы:


189

Просто используйте, String.replace(CharSequence,CharSequence)а не replaceAll.


13
Это не просто заменяет первое? Как ни странно, они назвали это «replaceAll» вместо «replaceRegex».
Magic Octopus Urn

6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));возвращается "hi world, hi life, hi you".
Тьяго Мата

14
@MagicOctopusUrn: Да, я согласен, это было очень плохое именование - со временем это вызвало много путаницы.
Джон Скит

очень плохое название методов. Почему они (солнце / оракул) усложняют простые вещи
Stunner

94

Метод добавления побегов является Pattern.quote().

String replaced = myString.replaceAll(Pattern.quote(matchingStr), replacementStr)

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


Отлично работает, например, если у вас есть "$" в matchStr.
Жюльен Лафон,

скорее Pattern.compile (); Pattern.quote () приносит нежелательные результаты
Павел Зварыч

@PavloZvarych: Pattern.compile()компилирует строку как регулярное выражение, то есть специальные символы будут иметь особое значение. Это полная противоположность тому Pattern.quote(), что делает, и то, о чем просил OP ( quote()говорит: «обрабатывать строку как литерал»). Может быть, вы могли бы подробнее рассказать о «нежелательных результатах», о которых вы говорите.
Марк Петерс

@MarkPeters это было что-то вроде \\ G1 \\ G за «1 доллар»
Павел Зварыч

1
@PavloZvarych: Если вы пытаетесь процитировать замену (а не шаблон поиска), вы хотите использовать Matcher.quoteReplacement("$aa +"). Pattern.compile()производит a Pattern, а не a String, поэтому мне непонятно, как вы вообще его используете replaceAll.
Марк Петерс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.