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

Разделение строки Java несколькими разделителями

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

1. Введение

Все мы знаем, что разбиение строки — очень распространенная задача. Однако мы часто разделяем, используя только один разделитель.

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

2. Разделение строки Java несколькими разделителями

Чтобы показать, как каждое из приведенных ниже решений выполняет разбиение, мы будем использовать одну и ту же строку примера:

String example = "Mary;Thomas:Jane-Kate";
String[] expectedArray = new String[]{"Mary", "Thomas", "Jane", "Kate"};

2.1. Решение для регулярных выражений

Программисты часто используют различные регулярные выражения для определения шаблона поиска строк. Они также являются очень популярным решением, когда дело доходит до разделения строки. Итак, давайте посмотрим, как мы можем использовать регулярное выражение для разделения строки по нескольким разделителям в Java.

Во-первых, нам не нужно добавлять новую зависимость, поскольку регулярные выражения доступны в пакете java.util.regex . Нам просто нужно определить входную строку, которую мы хотим разделить, и шаблон.

Следующим шагом будет нанесение узора. Шаблон может совпадать ноль или несколько раз. Чтобы разделить по разным разделителям, мы должны просто установить все символы в шаблоне.

Мы напишем простой тест, чтобы продемонстрировать этот подход:

String[] names = example.split("[;:-]");
Assertions.assertEquals(4, names.length);
Assertions.assertArrayEquals(expectedArray, names);

Мы определили тестовую строку с именами, которые должны быть разделены символами в шаблоне. Сам шаблон содержит точку с запятой, двоеточие и дефис. Применительно к строке примера мы получим четыре имени в массиве.

2.2. Решение гуавы

Guava также предлагает решение для разделения строки на несколько разделителей. Его решение основано на классе Splitter . Этот класс извлекает подстроки из входной строки, используя последовательность разделителей. Мы можем определить эту последовательность несколькими способами:

  • как один персонаж
  • фиксированная строка
  • регулярное выражение
  • экземпляр CharMatcher _

Далее в классе Splitter есть два метода для определения разделителей. Итак, давайте протестируем их обоих.

Во-первых, мы добавим зависимость Guava :

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>

Затем мы начнем с метода on : public static Splitter on(Pattern separatorPattern)

Он принимает шаблон для определения разделителей для разделения. Сначала мы определим комбинацию разделителей и скомпилируем шаблон. После этого мы можем разделить строку.

В нашем примере мы будем использовать регулярное выражение для указания разделителей:

Iterable<String> names = Splitter.on(Pattern.compile("[;:-]")).split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

Другой метод — это метод onPattern : общедоступный статический Splitter onPattern (String separatorPattern)

Разница между этим и предыдущим методом заключается в том, что метод onPattern принимает шаблон в виде строки. Нет необходимости компилировать его, как в методе on . Мы определим ту же комбинацию разделителей для тестирования метода onPattern :

Iterable<String> names = Splitter.onPattern("[;:-]").split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

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

Поскольку мы разбиваем входную строку несколькими разделителями, мы также можем использовать метод anyOf в классе CharMatcher :

Iterable<String> names = Splitter.on(CharMatcher.anyOf(";:-")).split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

Этот параметр доступен только с методом on в классе Splitter . Результат такой же, как и для предыдущих двух тестов.

2.3. Решение Apache Commons

Последний вариант, который мы обсудим, доступен в библиотеке Apache Commons Lang 3.

Мы начнем с добавления зависимости Apache Commons Lang в наш файл pom.xml :

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>

Далее воспользуемся методом split из класса StringUtils :

String[] names = StringUtils.split(example, ";:-");
Assertions.assertEquals(4, names.length);
Assertions.assertArrayEquals(expectedArray, names);

Нам нужно только определить все символы, которые мы будем использовать для разделения строки. Вызов метода split разделит строку примера на четыре имени.

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

В этой статье мы видели различные варианты разделения входной строки по нескольким разделителям. Сначала мы обсудили решение, основанное на регулярных выражениях и простой Java. Позже мы показали различные варианты, доступные в Guava. Наконец, мы завершили наши примеры решением, основанным на библиотеке Apache Commons Lang 3.

Как всегда, код этих примеров доступен на GitHub .