Как найти позицию подстроки в строке
Короткий ответ
indexOf() возвращает индекс первого вхождения, начиная с нуля, или -1, если подстроки нет:
void main() {
String text = "hello world";
IO.println(text.indexOf("o"));
IO.println(text.indexOf("x"));
}Результат:
4
-1Последнее вхождение
lastIndexOf() ищет с конца:
void main() {
IO.println("hello world".lastIndexOf("o"));
}Результат:
7Все вхождения
Второй аргумент indexOf() задаёт, откуда начинать поиск:
void main() {
String text = "abcabcabc";
var positions = new ArrayList<Integer>();
for (int i = text.indexOf("bc"); i != -1; i = text.indexOf("bc", i + 1)) {
positions.add(i);
}
IO.println(positions);
}Результат:
[1, 4, 7]Вырезать часть строки
Позиция пригодится, чтобы взять часть строки через substring():
void main() {
String email = "anna@example.com";
int at = email.indexOf('@');
IO.println(email.substring(0, at));
IO.println(email.substring(at + 1));
}Результат:
anna
example.comЧастая ошибка
Не проверить результат на -1. Тогда substring() получает отрицательный индекс и выбрасывает исключение:
void main() {
String text = "no separator";
int index = text.indexOf(':');
IO.println(text.substring(index + 1, index));
}Результат:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: Range [0, -1) out of bounds for length 12Всегда проверяйте if (index != -1) перед использованием позиции.
Функции из этого ответа
- String.indexOf() — Находит позицию первого вхождения символа или подстроки.
- String.lastIndexOf() — Находит позицию последнего вхождения символа или подстроки.
- String.substring() — Возвращает часть строки между двумя индексами.
- String.contains() — Проверяет, есть ли в строке подстрока.