Определение позиции подстроки в строке в Java: методы и примеры

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для определения позиции вхождения подстроки в заданной строке, вам нужно использовать метод indexOf:

Java
Скопировать код
String str = "Пример";
int pos = str.indexOf("ри");
// pos будет равен 2, если в строке есть такая подстрока

Если подстрока в строке отсутствует, метод вернёт -1:

Java
Скопировать код
int pos = str.indexOf("торт");
// pos будет равен -1, поскольку в заданной строке нет подстроки "торт"

Чтобы найти все позиции, где встречается определённая подстрока, можно использовать цикл:

Java
Скопировать код
int startIndex = 0;
while ((startIndex = str.indexOf("ри", startIndex)) != -1) {
    System.out.println(startIndex);
    // Увеличиваем startIndex, чтобы продолжить поиск с позиции следующего символа
    startIndex += "ри".length();
}
Кинга Идем в IT: пошаговый план для смены профессии

Всех под одну гребёнку: определение позиций множественных вхождений подстроки

Когда подстрока встречается в строке несколько раз, метод indexOf поможет определить все позиции её вхождений:

Java
Скопировать код
int startIndex = 0;
while ((startIndex = str.indexOf("ри", startIndex)) != -1) {
    int endIndex = startIndex + "ри".length();
    System.out.println("Подстрока совпадает из позиции: " + startIndex + " до " + (endIndex – 1));
    startIndex = endIndex; // Перемещаемся к концу текущего вхождения
}

Регулярные выражения: усовершенствованный поиск подстрок

Для работы со сложными шаблонами необходимо использовать классы Pattern и Matcher:

Java
Скопировать код
Pattern pattern = Pattern.compile("ри");
Matcher matcher = pattern.matcher("Пример");

while (matcher.find()) {
    System.out.println("Вхождение начинается с позиции: " + matcher.start());
}

Метод find() является вашим проводником в поиске, а start() указывает начало найденного вхождения. В свою очередь, end() определит позицию сразу после вхождения.

Визуализация

Представьте, что перед вами стоят книги на полке:

Markdown
Скопировать код
Полка: ["Java", "Python", "C++", "Java", "Ruby"]
Запрос: "Java"

Вы ищите на ней книгу под названием "Java":

Java
Скопировать код
indexOf("Java"); // Найдёт позицию 0.

И продолжаете поиски:

Java
Скопировать код
indexOf("Java", 1); // Найдёт позицию 3.

Используя метод indexOf, вы всплываете из тьмы и освещаете ключевые места на полке:

Markdown
Скопировать код
Позиции: [🔦0, 1, 2, 🔦3, 4]

Таким образом, indexOf изначально обнаруживает первое вхождение и продолжает поиск с указанной позиции.

Граничные случаи и руководство по применению метода с учётом эффективности

Начать с середины строки

Использование fromIndex с indexOf оптимизирует и ускоряет поиск в больших строках:

Java
Скопировать код
int fromIndex = 3;
int pos = str.indexOf("ри", fromIndex);
// Поиск начнётся с позиции, указанной в fromIndex, то есть 3

С конца, с использованием метода lastIndexOf

Если вам необходимо начать поиск с конца строки, воспользуйтесь lastIndexOf:

Java
Скопировать код
int posFromEnd = str.lastIndexOf("ри");
// posFromEnd также будет равен 2

Сравнение indexOf и regex

Для простого поиска подстрок метод indexOf будет работать быстрее, тогда как для поиска по сложным шаблонам больше подходят регулярные выражения. Выбирайте инструмент в соответствии с задачей!

Что стоит помнить и чего следует избегать

  • Берегитесь ошибок, связанных с единицей: они могут запутать вас.
  • При работе с циклами не забывайте обновлять индексы.
  • Используйте indexOf для обычных задач поиска и не усложняйте свою задачу регулярными выражениями, если это не требуется.

Полезные материалы

  1. String (Java Platform SE 7) — Документация по методу indexOf для строк в языке Java.
  2. Pattern (Java Platform SE 8) — Регулярные выражения в языке Java.
  3. Matcher (Java Platform SE 8) — Работа с классом Matcher для работы с регулярными выражениями.
  4. Regular Expression in Java – Java Regex Example | DigitalOcean — Введение в использование регулярных выражений в языке Java.
  5. Java String indexOf() Method with example — Детальное объяснение метода indexOf.
  6. java.lang.String#indexOf — Примеры использования метода indexOf в реальных проектах.
  7. Use Matcher to Find a Substring – Studytonight — Как использовать класс Matcher для поиска подстрок в языке Java.