1. Обзор
В этом руководстве мы рассмотрим различные способы удаления или замены части строки
в Java.
Мы рассмотрим удаление и/или замену подстроки с помощью String
API, затем с помощью StringBuilder
API и, наконец, с помощью класса StringUtils
библиотеки Apache Commons.
В качестве бонуса мы также рассмотрим возможность замены точного
слова с помощью String API и класса Apache Commons RegExUtils
.
2. Строковый
API
Одним из самых простых и понятных методов замены подстроки является использование replace, replaceAll
или replaceFirst
класса String.
Метод replace()
принимает два аргумента — целевой текст и текст замены:
String master = "Hello World ForEach!";
String target = "ForEach";
String replacement = "Java";
String processed = master.replace(target, replacement);
assertTrue(processed.contains(replacement));
assertFalse(processed.contains(target));
Приведенный выше фрагмент даст следующий результат:
Hello World Java!
Если при выборе цели требуется регулярное выражение, то методом выбора должен быть метод replaceAll()
или replaceFirst() .
Как следует из их названия, replaceAll()
заменит каждое совпавшее вхождение, а replaceFirst()
заменит первое совпавшее вхождение:
String master2 = "Welcome to ForEach, Hello World ForEach";
String regexTarget = "(ForEach)$";
String processed2 = master2.replaceAll(regexTarget, replacement);
assertTrue(processed2.endsWith("Java"));
Значение обрабатываемого2
будет:
Welcome to ForEach, Hello World Java
Это связано с тем, что регулярное выражение, предоставленное как regexTarget
, будет соответствовать только последнему вхождению ForEach.
Во всех примерах, приведенных выше, мы можем использовать пустую замену, и она эффективно удалит цель
из мастера
.
3. API StringBuilder
Мы также можем манипулировать текстом в Java, используя класс StringBuilder
.
Здесь есть два метода: delete()
и replace()
.
Мы можем создать экземпляр StringBuilder
из существующей строки
, а затем использовать упомянутые методы для выполнения необходимых манипуляций со строкой :
String master = "Hello World ForEach!";
String target = "ForEach";
String replacement = "Java";
int startIndex = master.indexOf(target);
int stopIndex = startIndex + target.length();
StringBuilder builder = new StringBuilder(master);
Теперь мы можем удалить цель
с помощью delete()
:
builder.delete(startIndex, stopIndex);
assertFalse(builder.toString().contains(target));
Мы также можем использовать replace()
для обновления мастера:
builder.replace(startIndex, stopIndex, replacement);
assertTrue(builder.toString().contains(replacement));
Одно очевидное различие между использованием StringBuilder
и String
API заключается в том, что мы должны сами получить начальный и конечный индексы целевой
строки
.
4. Класс StringUtils
Другой метод, который мы рассмотрим, — это библиотека Apache Commons.
Для начала добавим в наш проект необходимую зависимость:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
Последнюю версию библиотеки можно найти здесь.
Класс StringUtils
имеет методы для замены подстроки String
:
String master = "Hello World ForEach!";
String target = "ForEach";
String replacement = "Java";
String processed = StringUtils.replace(master, target, replacement);
assertTrue(processed.contains(replacement));
Существует перегруженный вариант replace()
, который принимает целочисленный параметр max
, который определяет количество заменяемых вхождений. Мы также можем использовать replaceIgnoreCase()
, если чувствительность к регистру не имеет значения :
String master2 = "Hello World ForEach!";
String target2 = "foreach";
String processed2 = StringUtils.replaceIgnoreCase(master2, target2, replacement);
assertFalse(processed2.contains(target));
5. Замена точных слов
В этом последнем примере мы узнаем, как заменить точное слово внутри String
.
Простой способ выполнить эту замену — использовать регулярное выражение с границами слов.
Регулярное выражение границы слова — \b
. Включение нужного слова в это регулярное выражение будет соответствовать только точным вхождениям.
Во-первых, давайте посмотрим, как использовать это регулярное выражение с String API:
String sentence = "A car is not the same as a carriage, and some planes can carry cars inside them!";
String regexTarget = "\\bcar\\b";
String exactWordReplaced = sentence.replaceAll(regexTarget, "truck");
Строка calculateWordReplaced
содержит:
"A truck is not the same as a carriage, and some planes can carry cars inside them!"
Будет заменено только точное слово. Обратите внимание , что при работе с регулярными выражениями в Java всегда необходимо экранировать обратную косую черту .
Альтернативный способ выполнить эту замену — использовать класс RegExUtils
из библиотеки Apache Commons, который можно добавить в качестве зависимости, как мы видели в предыдущем разделе:
String regexTarget = "\\bcar\\b";
String exactWordReplaced = RegExUtils.replaceAll(sentence, regexTarget, "truck");
Хотя оба метода дадут один и тот же результат, решение о том, какой из них следует использовать, будет зависеть от нашего конкретного сценария.
6. Заключение
В заключение мы рассмотрели несколько способов удаления и замены подстроки в Java. Лучший метод для применения по-прежнему во многом зависит от текущей ситуации и контекста.
Как обычно, полный исходный код доступен на Github .