Замена подстроки без учёта регистра в Java: метод replace
Быстрый ответ
Для того чтобы заменить подстроки в Java, не обращая внимание на регистр, используйте класс Pattern
с флагом Pattern.CASE_INSENSITIVE
и примените метод replaceAll()
класса Matcher
:
String result = Pattern.compile(Pattern.quote("example"), Pattern.CASE_INSENSITIVE)
.matcher("Пример строки с ExAmple.")
.replaceAll(Matcher.quoteReplacement("sample"));
// "Example" и "ExAmple" были заменены на "sample".
Таким образом, вы создаёте шаблон для поиска, используя Pattern.quote
, что позволяет обрабатывать литералы без ошибок. Установка флага для игнорирования регистра обеспечивает замену всех совпадений. Всё это выполняется в одном выражении — просто и эффективно!
Управление спецсимволами
Для замены в строках, содержащих специальные символы, используйте Matcher.quoteReplacement
для их экранирования:
String replacement = Matcher.quoteReplacement("$sample$");
String result = Pattern.compile(Pattern.quote("example"), Pattern.CASE_INSENSITIVE)
.matcher("Пример строки.")
.replaceAll(replacement);
// Таким образом, символ "$" не вызовет ошибку в процессе замены.
Реализация циклов как у профессионала
Если вам нужно выполнить замены в цикле, оптимальным решением будет предварительная подготовка шаблонов:
Pattern pattern = Pattern.compile(Pattern.quote("example"), Pattern.CASE_INSENSITIVE);
for(String input : inputList) {
String result = pattern.matcher(input).replaceAll("sample");
// "example" заменяется на "sample" в каждом элементе списка.
}
Таким образом, вы повышаете производительность, экономя ресурсы на каждой итерации, и снижаете нагрузку на сборщик мусора.
Обработка данных без использования регулярных выражений
Вы можете обойтись без регулярных выражений, используя StringBuilder
и метод toLowerCase
:
StringBuilder sb = new StringBuilder(inputString.toLowerCase());
String targetLower = targetString.toLowerCase();
int index = sb.indexOf(targetLower);
while(index != -1) {
sb.replace(index, index + targetLower.length(), replacementString);
index += replacementString.length();
index = sb.indexOf(targetLower, index);
// Так выполняется замена всех вхождений подстроки.
}
String result = sb.toString().trim();
Внимание к производительности
Важно всегда учитывать производительность, особенно при обработке больших данных или при частом выполнении замен. Адаптируйте подход к своим потребностям и измеряйте результаты.
Альтернативы и их последствия
Может быть облегчающим использование сторонних библиотек, но встроенные функции JDK стоят того, чтобы их не игнорировать, так как они обеспечивают стабильность и безопасность. Имейте в виду, что внешние библиотеки влекут за собой дополнительную ответственность и риск возникновения уязвимостей.
Визуализация
Процесс замены подстрок можно представить через метафору хамелеона, приспосабливающегося к своей окружающей среде:
Оригинал: "Java – это отлично. JAVA – мощный инструмент. java – везде."
Шаблон: "(?i)java"
Замена: "Python"
Результат:
**До**: [🦎🟢, 🦎🔵, 🦎🟡]
**После**: ["Python"🐍, "Python"🐍, "Python"🐍]
Хамелеон, как и шаблон "java", паритетно приспосабливается к новому контексту "Python", наглядно демонстрируя процесс замены.
Ситуации, когда toUpperCase работает как на призёрство
Иногда достаточно просто привести строки к верхнему регистру для сравнения. Но следует быть осторожным: сложные данные могут потребовать более изощренного использования регулярных выражений.
String result = inputString.toUpperCase().replace(targetString.toUpperCase(), replacementString);
Тестирование во всех оттенках
Не забывайте о тщательном тестировании методов работы со строками. Строки могут содержать специальные символы, особенности регистра и могут различаться по уровню загрузки на производительность.
Использование StringBuffer для гарантированной нитевой безопасности
Если требуется нитевая безопасность, используйте StringBuffer
вместо StringBuilder
. Он обеспечивает синхронизированные методы.
StringBuffer sb = new StringBuffer("Пример");
// Гарантированна нитевая безопасность.
В стремлении к бесконечности, но с ответственностью
Всегда следите за корректностью ваших циклов, избегая ситуаций бесконечного выполнения.
Сравнения на равенство с учётом регистра
Для сравнения строк без учета регистра удобно использовать equalsIgnoreCase
:
if(str1.equalsIgnoreCase(str2)) {
// Обе строки равны, несмотря на различие в регистре.
}
Вспомнить о предшествующих версиях
В версиях JDK до версии 7 включительно метод String.replace()
для замены без учета регистра "из коробки" не поддерживается. В таких случаях будут актуальными альтернативные варианты, описанные в этой статье.
Полезные материалы
- Pattern (Java Platform SE 7) — Детальная документация по классу Pattern.
- Matcher (Java Platform SE 7) — Возможности класса Matcher.
- String (Java Platform SE 7) — Описание метода replaceAll() и его применение.
- Использование регулярных выражений в Java — Основная информация по работе с регулярными выражениями в Java.
- StringUtils (Apache Commons Lang 3.11 API) — Apache Commons Lang и его StringUtils для упрощения работы со строками.
- Just a second... — Статья о методе ReplaceAll() в Java 8, детальное руководство с примерами.