String.replaceВсі без RegEx


115

Я хотів би замінити всі екземпляри підрядки в рядку, але String.replaceAll()приймає лише шаблон. Рядок, який я отримав з попереднього матчу. Чи можна додати ухили до шаблону, який у мене є, чи є версія replaceAll()іншого класу, яка приймає буквальний рядок замість шаблону?


можливий дублікат проблеми Backslash з String.replaceAll
McDowell

Відповіді:


189

Просто використовувати, String.replace(CharSequence,CharSequence)а не використовувати replaceAll.


13
Це не просто замінює перше? Дивно, що вони назвали це "замінаАле" замість "замінитиРегекс".
Чарівний восьминога Урна

6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));повертає "hi world, hi life, hi you".
Тіаго Мата

14
@MagicOctopusUrn: Так, я погоджуюся, це було дуже погано називати - це викликало багато плутанини з часом.
Джон Скіт

дуже погано називати методи. Чому вони (сонце / оракул) ускладнюють прості речі
Stunner

93

Метод додавання вхідних даних є Pattern.quote() .

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

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


Чудово працює, якщо, наприклад, у вашому matchStr є "$".
Жульєн Лафонт

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

@PavloZvarych: Pattern.compile()збирає рядок як регулярний вираз, тобто спеціальним символам буде надано особливе значення. Це повна протилежність тому, що Pattern.quote()робить, і чого просив ОП ( quote()каже, "ставимось до рядка як до прямого"). Можливо, ви могли б розширити, про які "небажані результати" ви говорите.
Марк Петерс

@MarkPeters це було щось на кшталт \\ G1 \\ G за "$ 1"
Павло Зварич

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