Определение позиции подстроки в строке в Java: методы и примеры
Быстрый ответ
Для определения позиции вхождения подстроки в заданной строке, вам нужно использовать метод indexOf
:
String str = "Пример";
int pos = str.indexOf("ри");
// pos будет равен 2, если в строке есть такая подстрока
Если подстрока в строке отсутствует, метод вернёт -1:
int pos = str.indexOf("торт");
// pos будет равен -1, поскольку в заданной строке нет подстроки "торт"
Чтобы найти все позиции, где встречается определённая подстрока, можно использовать цикл:
int startIndex = 0;
while ((startIndex = str.indexOf("ри", startIndex)) != -1) {
System.out.println(startIndex);
// Увеличиваем startIndex, чтобы продолжить поиск с позиции следующего символа
startIndex += "ри".length();
}
Всех под одну гребёнку: определение позиций множественных вхождений подстроки
Когда подстрока встречается в строке несколько раз, метод indexOf
поможет определить все позиции её вхождений:
int startIndex = 0;
while ((startIndex = str.indexOf("ри", startIndex)) != -1) {
int endIndex = startIndex + "ри".length();
System.out.println("Подстрока совпадает из позиции: " + startIndex + " до " + (endIndex – 1));
startIndex = endIndex; // Перемещаемся к концу текущего вхождения
}
Регулярные выражения: усовершенствованный поиск подстрок
Для работы со сложными шаблонами необходимо использовать классы Pattern
и Matcher
:
Pattern pattern = Pattern.compile("ри");
Matcher matcher = pattern.matcher("Пример");
while (matcher.find()) {
System.out.println("Вхождение начинается с позиции: " + matcher.start());
}
Метод find()
является вашим проводником в поиске, а start()
указывает начало найденного вхождения. В свою очередь, end()
определит позицию сразу после вхождения.
Визуализация
Представьте, что перед вами стоят книги на полке:
Полка: ["Java", "Python", "C++", "Java", "Ruby"]
Запрос: "Java"
Вы ищите на ней книгу под названием "Java":
indexOf("Java"); // Найдёт позицию 0.
И продолжаете поиски:
indexOf("Java", 1); // Найдёт позицию 3.
Используя метод indexOf
, вы всплываете из тьмы и освещаете ключевые места на полке:
Позиции: [🔦0, 1, 2, 🔦3, 4]
Таким образом, indexOf
изначально обнаруживает первое вхождение и продолжает поиск с указанной позиции.
Граничные случаи и руководство по применению метода с учётом эффективности
Начать с середины строки
Использование fromIndex с indexOf
оптимизирует и ускоряет поиск в больших строках:
int fromIndex = 3;
int pos = str.indexOf("ри", fromIndex);
// Поиск начнётся с позиции, указанной в fromIndex, то есть 3
С конца, с использованием метода lastIndexOf
Если вам необходимо начать поиск с конца строки, воспользуйтесь lastIndexOf
:
int posFromEnd = str.lastIndexOf("ри");
// posFromEnd также будет равен 2
Сравнение indexOf и regex
Для простого поиска подстрок метод indexOf
будет работать быстрее, тогда как для поиска по сложным шаблонам больше подходят регулярные выражения. Выбирайте инструмент в соответствии с задачей!
Что стоит помнить и чего следует избегать
- Берегитесь ошибок, связанных с единицей: они могут запутать вас.
- При работе с циклами не забывайте обновлять индексы.
- Используйте
indexOf
для обычных задач поиска и не усложняйте свою задачу регулярными выражениями, если это не требуется.
Полезные материалы
- String (Java Platform SE 7) — Документация по методу indexOf для строк в языке Java.
- Pattern (Java Platform SE 8) — Регулярные выражения в языке Java.
- Matcher (Java Platform SE 8) — Работа с классом Matcher для работы с регулярными выражениями.
- Regular Expression in Java – Java Regex Example | DigitalOcean — Введение в использование регулярных выражений в языке Java.
- Java String indexOf() Method with example — Детальное объяснение метода indexOf.
- java.lang.String#indexOf — Примеры использования метода indexOf в реальных проектах.
- Use Matcher to Find a Substring – Studytonight — Как использовать класс Matcher для поиска подстрок в языке Java.