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

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

1. обзор

В этом руководстве мы рассмотрим различные способы удаления или замены частиString в Java.

Мы рассмотрим удаление и / или замену подстроки с помощью APIString, затем с помощью APIStringBuilder и, наконец, с помощью классаStringUtils библиотеки Apache Commons.

В качестве бонусаwe’ll also look into replacing an exact word using the String API and the Apache Commons RegExUtils class.

2. String API

Один из самых простых и понятных методов замены подстроки - использоватьreplace, replaceAll orreplaceFirst из aString class.

Методreplace() принимает два аргумента - целевой и замещающий текст:

String master = "Hello World example!";
String target = "example";
String replacement = "Java";
String processed = master.replace(target, replacement);
assertTrue(processed.contains(replacement));
assertFalse(processed.contains(target));

Приведенный выше фрагмент даст такой вывод:

Hello World Java!

Если для выбора цели требуется регулярное выражение, то следует выбрать методreplaceAll() илиreplaceFirst(). Как следует из их названия,replaceAll() will заменяет каждое совпадающее вхождение, аreplaceFirst() заменяет первое совпадающее вхождение:

String master2 = "Welcome to example, Hello World example";
String regexTarget = "(example)$";
String processed2 = master2.replaceAll(regexTarget, replacement);
assertTrue(processed2.endsWith("Java"));

Значениеprocessed2 будет:

Welcome to example, Hello World Java

Это связано с тем, что регулярное выражение, представленное какregexTarget, будет соответствовать только последнему вхождениюexample. In all examples given above, we can use an empty replacement and it’ll effectively remove a target from a master.

3. StringBuilder API

Мы также можем управлять текстом в Java, используя классStringBuilder. Здесь используются два метода:delete() иreplace().

Мы можем построить экземплярStringBuilder  из существующегоString, а затем использовать упомянутые методы для выполнения манипуляции сString по желанию:

String master = "Hello World example!";
String target = "example";
String replacement = "Java";

int startIndex = master.indexOf(target);
int stopIndex = startIndex + target.length();

StringBuilder builder = new StringBuilder(master);

Теперь мы можем удалитьtarget с помощьюdelete():

builder.delete(startIndex, stopIndex);
assertFalse(builder.toString().contains(target));

Мы также можем использоватьreplace() для обновления мастера:

builder.replace(startIndex, stopIndex, replacement);
assertTrue(builder.toString().contains(replacement));

Одно очевидное различие между использованиемStringBuilder иString API состоит в том, что мы сами должны получить начальный и конечный индексtargetString.

4. StringUtils класс

Еще один метод, который мы рассмотрим, - это библиотека Apache Commons.

Для начала добавим в наш проект необходимую зависимость:


    org.apache.commons
    commons-lang3
    3.8.1

Последнюю версию библиотеки можно найтиhere.

В классеStringUtils есть методы для замены подстрокиString:

String master = "Hello World example!";
String target = "example";
String replacement = "Java";

String processed = StringUtils.replace(master, target, replacement);
assertTrue(processed.contains(replacement));

Существует перегруженный вариантreplace(), который принимает целочисленный параметрmax, который определяет количество заменяемых экземпляров. We can also use the replaceIgnoreCase() if case-sensitivity is not a concern:

String master2 = "Hello World example!";
String target2 = "example";
String processed2 = StringUtils.replaceIgnoreCase(master2, target2, replacement);
assertFalse(processed2.contains(target));

5. Замена точных слов

В этом последнем примереwe’ll learn how to replace an exact word inside a String.

Самый простой способ выполнить эту замену -using a regular expression с границами слов.

The word boundary regular expression is . Заключение искомого слова в это регулярное выражение будет соответствовать только точным вхождениям.

Во-первых, давайте посмотрим, как использовать это регулярное выражение с 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");

СтрокаexactWordReplaced содержит:

"A truck is not the same as a carriage, and some planes can carry cars inside them!"

Only the exact word will be replaced. Обратите внимание наbackward slash always needs to be escaped при работе с регулярными выражениями в Java.

Альтернативный способ сделать эту замену - использовать классRegExUtils из библиотеки Apache Commons, который можно добавить в качестве зависимости, как мы видели в предыдущем разделе:

String regexTarget = "\\bcar\\b";
String exactWordReplaced = RegExUtils.replaceAll(sentence, regexTarget, "truck");

Хотя оба метода дадут один и тот же результат, решение о том, какой из них следует использовать, будет зависеть от нашего конкретного сценария.

6. Заключение

В заключение мы рассмотрели несколько способов удаления и замены подстроки в Java. Лучший способ применить все еще в значительной степени зависит от текущей ситуации и контекста.

Как обычно, доступен полный исходный кодover on Github.