Перейти к основному содержимому

Удалить или заменить часть строки в Java

· 4 мин. чтения

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 .