Получить подстроку из строки в Java
1. обзор
В этом руководстве мы узнаем, как получить подстроку изString в 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. Maven Зависимости
Чтобы использовать классStringUtils, который является частью библиотекиApache Commons Lang, нам нужно добавить следующую зависимость в проект Maven:
org.apache.commons
commons-lang3
3.8
Вы можете найти последнюю версию этой библиотекиhere.
3. Используяsubstring
Это наиболее часто используемый метод для извлечения подстроки. Вы можете предоставить начальный индекс и необязательный конечный индекс для извлечения символов между ними.
Если мы не укажем конечный индекс, подстрока будет до концаString.
Предположим, мы хотим извлечь страну проживания Джулии:
assertEquals("USA (United States of America).",
text.substring(67));
Чтобы избавиться от периода в конце вывода, мы можем использовать слегка модифицированную версию того же метода:
assertEquals("USA (United States of America)",
text.substring(67, text.length() - 1));
В приведенных выше примерах мы использовали точное положение для извлечения подстроки.
3.1. Получение подстроки, начинающейся с определенного символа
В случае, если позицию необходимо динамически вычислять на основе символа илиString, мы можем использовать метод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 могут принимать символ илиString в качестве параметра. Выделим текст «США» и остальной текст в скобках:
assertEquals("USA (United States of America)",
text.substring(text.indexOf("USA"), text.indexOf(')') + 1));
4. ИспользуяsubSequence
КлассString предоставляет другой метод под названиемsubSequence, который действует аналогично методуsubstring.
Единственное отличие состоит в том, что он возвращаетCharSequence вместоString, и его можно использовать только с определенным начальным и конечным индексами:
assertEquals("USA (United States of America)",
text.subSequence(67, text.length() - 1));
5. Использование регулярных выражений
Нам на помощь придут регулярные выраженияif we have to extract a substring that matches a specific pattern.
В примереString, дата рождения Джулии указана в формате «дд-мм-гггг». Мы можем сопоставить этот шаблон, используя API регулярных выражений Java.
Прежде всего, нам нужно создать шаблон для «дд-мм-гггг»:
Pattern pattern = Pattern.compile("\\d{2}-\\d{2}-\\d{4}");
Затем мы применим шаблон, чтобы найти совпадение в заданном тексте:
Matcher matcher = pattern.matcher(text);
После успешного совпадения мы можем извлечь совпавшиеString:
if (matcher.find()) {
Assert.assertEquals("25-09-1984", matcher.group());
}
Дополнительные сведения о регулярных выражениях Java см. В руководствеthis.
6. Используяsplit
Мы можем использовать методsplit из классаString для извлечения подстроки. Допустим, мы хотим извлечь первое предложение из примераString.. Это довольно легко сделать с помощьюsplit:
String[] sentences = text.split("\\.");
Так как метод split принимает регулярное выражение, нам пришлось избегать символа точки. Теперь результатом является массив из 2 предложений.
Мы можем использовать первое предложение (или перебрать весь массив):
assertEquals("Julia Evans was born on 25-09-1984", sentences[0]);
Обратите внимание, что существуют более эффективные способы обнаружения предложений и токенизации с использованием Apache OpenNLP. Ознакомьтесь с руководствомthis, чтобы узнать больше об OpenNLP API.
7. ИспользуяScanner
Обычно мы используемScanner для анализа примитивных типов иStrings с использованием регулярных выражений. A Scanner breaks its input into tokens using a delimiter pattern, который по умолчанию соответствует пробелу.
Давайте узнаем, как использовать это, чтобы получить первое предложение из текста примера:
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()
}
8. ИспользуяStringUtils
Библиотеки Apache Commons добавляют несколько полезных методов для управления основными типами Java. Apache Commons Lang предоставляет множество вспомогательных утилит для API java.lang, в первую очередь методов манипуляцииString.
В этом примере мы увидимhow to extract a substring nested between two Strings:
assertEquals("United States of America",
StringUtils.substringBetween(text, "(", ")"));
Существует упрощенная версия этого метода на случай, если подстрока вложена между двумя экземплярами одного и того жеString:.
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 с помощью Apache Commons Lang API.
9. Заключение
В этой быстрой статье мы узнали о различных способах извлечения подстроки изString в Java. Вы можете изучить нашother tutorials по манипуляции сString на Java.
Как всегда, фрагменты кода можно найтиover on GitHub.