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. Получение подстроки, начинающейся с определенного символа
В случае, если позиция должна быть рассчитана динамически на основе символа или строки
, мы можем использовать метод indexOf
:
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
предоставляет другой метод, называемый subSequence
, который действует аналогично методу подстроки
.
Единственное отличие состоит в том, что он возвращает CharSequence
вместо String
и может использоваться только с определенным начальным и конечным индексом:
assertEquals("USA (United States of America)",
text.subSequence(67, text.length() - 1));
4. Использование регулярных выражений
Регулярные выражения придут нам на помощь , если нам нужно извлечь подстроку, соответствующую определенному шаблону.
В примере String
дата рождения Юлии представлена в формате «дд-мм-гггг». Мы можем сопоставить этот шаблон, используя 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
для анализа примитивных типов и строк
с использованием регулярных выражений. Сканер разбивает входные
данные на токены, используя шаблон разделителя , который по умолчанию соответствует пробелу.
Давайте узнаем, как использовать это, чтобы получить первое предложение из текста примера:
try (Scanner scanner = new Scanner(text)) {
scanner.useDelimiter("\\.");
assertEquals("Julia Evans was born on 25-09-1984", scanner.next());
}
В приведенном выше примере мы установили строку
примера в качестве источника для использования сканером.
Затем мы устанавливаем символ точки в качестве разделителя (который необходимо экранировать, иначе он будет рассматриваться как специальный символ регулярного выражения в этом контексте).
Наконец, мы подтверждаем первый токен из этого вывода с разделителями.
При необходимости мы можем перебрать всю коллекцию токенов, используя цикл while
.
while (scanner.hasNext()) {
// do something with the tokens returned by scanner.next()
}
7. Зависимости Maven
Мы можем пойти немного дальше и использовать полезную утилиту — класс StringUtils
— часть библиотеки Apache Commons Lang :
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
Вы можете найти последнюю версию этой библиотеки здесь .
8. Использование StringUtils
Библиотеки Apache Commons добавляют несколько полезных методов для управления основными типами Java. Apache Commons Lang предоставляет множество вспомогательных утилит для API java.lang, в первую очередь методы манипулирования строками .
В этом примере мы увидим, как извлечь подстроку, вложенную между двумя строками:
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"));
Вы можете ознакомиться с этим руководством, чтобы узнать больше об обработке строк
с помощью Apache Commons Lang API.
9. Заключение
В этой быстрой статье мы узнали о различных способах извлечения подстроки из строки
в Java. Вы можете изучить другие наши руководства по работе со строками
в Java.
Как всегда, фрагменты кода можно найти на GitHub .