JavaScript substring: извлечение текста по индексам

Метод JavaScript substring извлекает символы между двумя позициями индекса и возвращает новую строку. Он принимает начальный индекс и необязательный конечный индекс (не включая его), беря всё от start до end. Когда конечный индекс пропущен, извлечение продолжается до конца строки. В отличие от slice, substring автоматически меняет аргументы местами, если start больше end, поэтому вы не получаете случайный пустой результат.

Пример JavaScript Substring для извлечения текста

Вывод:

Результат появится здесь...

Вывод:

Имя: report-2024
Расширение: csv

Как работает этот пример

  1. filename.lastIndexOf(".") возвращает 11 — позицию последней точки в строке.
  2. filename.substring(0, 11) извлекает символы от индекса 0 до (не включая) индекса 11, получая "report-2024".
  3. filename.substring(12) вызывается без второго аргумента, поэтому извлечение идёт от индекса 12 до конца строки и возвращает "csv".
  4. Оба вызова возвращают новые строки, а исходная filename не изменяется, потому что строки в JavaScript неизменяемы.

Частые ошибки с JavaScript substring

Ожидать, что отрицательные индексы считаются от конца.

Неправильно:

"hello".substring(-3); // "hello", а не "llo"

Правильно:

"hello".slice(-3); // "llo"

substring ограничивает отрицательные значения до 0, поэтому substring(-3) превращается в substring(0) и возвращает всю строку. Для смещений от конца используйте slice.

Воспринимать второй аргумент как длину.

Неправильно:

"abcdef".substring(2, 3); // "c", а не "cde"

Правильно:

"abcdef".substring(2, 5); // "cde"

Второй параметр — это конечный индекс, а не количество символов. Эта путаница часто возникает из-за устаревшего substr(start, length), где "abcdef".substr(2, 3) возвращает "cde". При переходе с substr переводите длину в конечный индекс: start + length.

JavaScript substring и slice

Поведениеsubstring(start, end)slice(start, end)
Отрицательные аргументыОграничиваются до 0Считаются от конца строки
start > endАргументы автоматически меняются местамиВозвращает пустую строку ""
Индекс вне диапазонаОграничивается до string.lengthОграничивается до string.length
Изменяет исходную строкуНетНет

Используйте substring, когда индексы получаются из вычислений и могут прийти в неправильном порядке: авто-перестановка гарантирует корректный результат. Используйте slice, когда отрицательные смещения заданы осознанно, например чтобы получить последние N символов через str.slice(-N).

Замена устаревшего substr на substring

Устаревший метод substr(start, length) (часто его ищут как JavaScript substr) всё ещё встречается в старом коде и помечен как deprecated в документации. Путаница между JavaScript substr и substring обычно связана с разным смыслом второго аргумента: substr принимает длину, а substring — конечный индекс. Чтобы миграция была безопасной:

  1. Замените str.substr(start, length) на str.substring(start, start + length).
  2. Если start может быть отрицательным, вместо этого используйте slice(start, start + length)substring ограничивает отрицательные значения до 0.
  3. Проверьте граничные случаи, где length равно 0, отрицательное или пропущено, потому что substr и substring ведут себя по-разному на таких входах.

FAQ

В чем разница между JavaScript substring и slice?

Оба метода извлекают часть строки по индексам, но по-разному ведут себя на граничных случаях. substring ограничивает отрицательные аргументы до 0 и меняет местами start/end, когда start больше. slice трактует отрицательные значения как смещения от конца и возвращает пустую строку, если start больше end. Для обычного извлечения слева направо оба метода дают одинаковый результат.

Изменяет ли JavaScript substring исходную строку?

Нет. Строки в JavaScript неизменяемы, поэтому любой строковый метод возвращает новую строку. После вызова substring исходное значение остаётся прежним. Сохраняйте результат в переменную, если нужна извлечённая часть.

Что происходит, когда start больше end в substring?

substring молча меняет аргументы местами. "abcdef".substring(4, 1) работает так же, как "abcdef".substring(1, 4), и возвращает "bcd". Такая нормализация защищает от неожиданных пустых строк, когда вычисления дают границы в обратном порядке.