Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как найти позицию подстроки в строке

Короткий ответ

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() — Проверяет, есть ли в строке подстрока.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.