Вземете Substring от String в Java

1. Общ преглед

В този бърз урок ще се съсредоточим върху функционалността на низовете на Strings в 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. Използване на subSequence

Класът String предоставя друг метод, наречен subSequence, който действа подобно на метода substring .

Единствената разлика е, че връща CharSequence вместо String и може да се използва само с определен начален и краен индекс:

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, за да извлечем подниз. Да кажем, че искаме да извлечем първото изречение от примерния низ. Това е доста лесно да се направи с помощта на split :

String[] sentences = text.split("\\.");

Тъй като методът split приема регулярно изражение, трябваше да избягаме от символа за период. Сега резултатът е масив от 2 изречения.

Можем да използваме първото изречение (или да прегледаме целия масив):

assertEquals("Julia Evans was born on 25-09-1984", sentences[0]);

Моля, имайте предвид, че има по-добри начини за откриване на изречения и токенизация с помощта на Apache OpenNLP. Вижте този урок, за да научите повече за OpenNLP API.

6. Използване на скенер

Обикновено използваме Scanner, за да анализираме примитивни типове и низове, използвайки регулярни изрази. A 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:

 org.apache.commons commons-lang3 3.8 

Можете да намерите най-новата версия на тази библиотека тук.

8. Използване на StringUtils

The Apache Commons libraries add some useful methods for manipulating core Java types. Apache Commons Lang provides a host of helper utilities for the java.lang API, most notably String manipulation methods.

In this example, we're going to see how to extract a substring nested between two Strings:

assertEquals("United States of America", StringUtils.substringBetween(text, "(", ")"));

There is a simplified version of this method in case the substring is nested in between two instances of the same String:

substringBetween(String str, String tag)

The substringAfter method from the same class gets the substring after the first occurrence of a separator.

The separator isn't returned:

assertEquals("the USA (United States of America).", StringUtils.substringAfter(text, "living in "));

Similarly, the substringBefore method gets the substring before the first occurrence of a separator.

The separator isn't returned:

assertEquals("Julia Evans", StringUtils.substringBefore(text, " was born"));

Можете да разгледате този урок, за да разберете повече за обработката на низове с помощта на Apache Commons Lang API.

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

В тази бърза статия открихме различни начини за извличане на подниз от низ в Java. Можете да разгледате другите ни уроци за манипулиране на низове в Java.

Както винаги, кодови фрагменти могат да бъдат намерени в GitHub.