1. Обзор
В этом кратком руководстве мы сосредоточимся на функциональности подстрок строк в Java.
В основном мы будем использовать методы из класса String и несколько из класса StringUtils Apache Commons.
Во всех следующих примерах мы будем использовать эту простую строку:
String text = "Julia Evans was born on 25-09-1984. " + "She is currently living in the USA (United States of America).";
2. Основы подстроки
Давайте начнем с очень простого примера – извлечения подстроки с начальным индексом:
assertEquals("USA (United States of America).", text.substring(67));
Обратите внимание, как мы извлекли страну проживания Джулии в нашем примере здесь.
Есть также возможность указать конечный индекс , но без него – подстрока будет идти до конца строки .
Давайте сделаем это и избавимся от этой лишней точки в конце, как в приведенном выше примере:
assertEquals("USA (United States of America)", text.substring(67, text.length() - 1));
В приведенных выше примерах мы использовали точное положение для извлечения подстроки.
2.1. Получение подстроки, начинающейся с определенного символа
В случае, если позиция должна быть динамически рассчитана на основе символа или Строка мы можем использовать Индекс метод:
assertEquals("United States of America", text.substring(text.indexOf('(') + 1, text.indexOf(')')));
Аналогичный метод, который может помочь нам найти нашу подстроку, – это lastIndexOf . Давайте используем lastIndexOf для извлечения года “1984”. Это часть текста между последней черточкой и первой точкой:
assertEquals("1984", text.substring(text.lastIndexOf('-') + 1, text.indexOf('.')));
И indexOf , и lastIndexOf могут принимать символ или строку в качестве параметра. Давайте извлекем текст “США” и остальную часть текста в скобках:
assertEquals("USA (United States of America)", text.substring(text.indexOf("USA"), text.indexOf(')') + 1));
3. Использование подпоследовательности
Класс String предоставляет другой метод, называемый Подпоследовательностью , который действует аналогично методу substring .
Единственная разница в том, что он возвращает CharSequence вместо Строка и он может использоваться только с определенным начальным и конечным индексом:
assertEquals("USA (United States of America)", text.subSequence(67, text.length() - 1));
4. Использование Регулярных Выражений
Регулярные выражения придут нам на помощь , если нам нужно извлечь подстроку, соответствующую определенному шаблону.
В примере Строка дата рождения Джулии находится в формате “дд-мм-гггг”. Мы можем сопоставить этот шаблон с помощью API регулярных выражений Java.
Прежде всего, нам нужно создать шаблон для “дд-мм-гггг”:
Pattern pattern = Pattern.compile("\\d{2}-\\d{2}-\\d{4}");
Затем мы применим шаблон, чтобы найти совпадение из данного текста:
Matcher matcher = pattern.matcher(text);
После успешного совпадения мы можем извлечь совпадающую строку :
if (matcher.find()) { Assert.assertEquals("25-09-1984", matcher.group()); }
Для получения более подробной информации о регулярных выражениях Java ознакомьтесь с этим руководством.
5. Использование разделения
Мы можем использовать метод split из класса String для извлечения подстроки. Допустим, мы хотим извлечь первое предложение из примера String. Это довольно легко сделать с помощью split :
String[] sentences = text.split("\\.");
Поскольку метод разделения принимает регулярное выражение, нам пришлось избежать символа точки. Теперь в результате получается массив из 2 предложений.
Мы можем использовать первое предложение (или перебирать весь массив):
assertEquals("Julia Evans was born on 25-09-1984", sentences[0]);
Пожалуйста, обратите внимание, что есть лучшие способы обнаружения предложений и токенизации с помощью Apache OpenNLP. Ознакомьтесь с этим руководством, чтобы узнать больше об API OpenNLP.
6. Использование сканера
Обычно мы используем Scanner для анализа примитивных типов и Строк с использованием регулярных выражений. A Scanner разбивает свой ввод на токены , используя шаблон разделителя , который по умолчанию соответствует пробелам.
Давайте выясним, как использовать это, чтобы получить первое предложение из текста примера:
try (Scanner scanner = new Scanner(text)) { scanner.useDelimiter("\\."); assertEquals("Julia Evans was born on 25-09-1984", scanner.next()); }
В приведенном выше примере мы установили пример String в качестве источника для использования сканером.
Затем мы устанавливаем символ точки в качестве разделителя (который должен быть экранирован, иначе он будет рассматриваться как специальный символ регулярного выражения в этом контексте).
Наконец, мы утверждаем первый токен из этого вывода с разделителями.
При необходимости мы можем перебрать всю коллекцию токенов, используя цикл while .
while (scanner.hasNext()) { // do something with the tokens returned by scanner.next() }
7. Зависимости Maven
Мы можем пойти немного дальше и использовать полезную утилиту – StringUtils class – часть библиотеки Apache Commons Lang :
org.apache.commons commons-lang3 3.11
Вы можете найти последнюю версию этой библиотеки здесь .
8. Использование стрингутилов
Библиотеки Apache Commons добавляют некоторые полезные методы для управления основными типами Java. Apache Commons Lang предоставляет множество вспомогательных утилит для API java.lang, в первую очередь String методы манипулирования.
В этом примере мы увидим как извлечь подстроку, вложенную между двумя строками :
assertEquals("United States of America", StringUtils.substringBetween(text, "(", ")"));
Существует упрощенная версия этого метода в случае, если подстрока вложена между двумя экземплярами одной и той же строки :
substringBetween(String str, String tag)
Метод substringAfter из того же класса получает подстроку после первого вхождения разделителя.
Разделитель не возвращается:
assertEquals("the USA (United States of America).", StringUtils.substringAfter(text, "living in "));
Аналогично, метод substringBefore получает подстроку перед первым вхождением разделителя.
Разделитель не возвращается:
assertEquals("Julia Evans", StringUtils.substringBefore(text, " was born"));
Вы можете ознакомиться с этим руководством, чтобы узнать больше об обработке String с помощью API Apache Commons Lang.
9. Заключение
В этой краткой статье мы выяснили различные способы извлечения подстроки из String в Java. Вы можете изучить наши другие учебные пособия по строковым манипуляциям в Java.
Как всегда, фрагменты кода можно найти на GitHub .