Получить подстроку из строки в Java

Получить подстроку из строки в 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.