Знайти входження підрядки в рядок у Java
У цьому пості ми обговоримо, як знайти загальну кількість входжень одного рядка в інший рядок Java. Порожнє або рядкове введення має повертати 0.
1. Використання indexOf() метод
Ідея полягає в тому, щоб використовувати indexOf() метод String class, який повертає в цьому рядку індекс першого входження зазначеної підрядки, починаючи з зазначеного індексу. Він повертається -1 якщо такого явища немає.
Хитрість полягає в тому, щоб почати з позиції, де закінчується останній знайдений підрядок. Це показано нижче:
Отримати підрядок з рядка Java
У цьому короткому посібнику ми зосередимося на функціональності підстрок рядків у Java.
В основному ми будемо використовувати методи з класу String і кілька класу StringUtils Apache Commons .
У всіх наступних прикладах ми будемо використовувати цей простий рядок:
String
text
=
"Julia Evans was born on 25-09-1984. "
+
"She is currently living в США (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. Давайте використовуємо останнійIndexOf для отримання року «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-\d-\d");
Потім ми застосуємо шаблон, щоб знайти збіг із заданого тексту:
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("\\.");
Оскільки метод поділу приймає регулярний вираз, нам довелося уникати символу точки. Тепер результатом є масив із двох пропозицій.
Ми можемо використовувати першу пропозицію (або перебрати весь масив):
assertEquals("Julia Evans was born on 25-09-1984",
sentences[0]);
Зверніть увагу, що є найкращі способи виявлення пропозицій та токенізації з використанням Apache 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.commonsgroupId>
artifactId>commons-lang3artifactId>
version>3.12.0version>
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.