Части строки
Часто нужна только часть строки: первая буква имени, год в дате. Метод sub (от substring, «подстрока», то есть часть строки) возвращает часть между двумя позициями. Символы строки нумеруются с 1, как элементы списка, и обе позиции включаются:
local word = "sunflower"
print(word:sub(1, 3))
print(word:sub(4, 9))
print(word:sub(4))Он выводит:
sun
flower
flowerБез второй позиции sub идёт до конца строки. Чтобы получить один символ, укажите одну и ту же позицию дважды: word:sub(1, 1) — это "s". В Lua нет особого типа для одного символа: это просто строка длиной 1.
Позиции могут быть и отрицательными. Тогда они отсчитываются с конца: -1 — последний символ, -2 — предпоследний и так далее. Это удобно, когда вы знаете, какой длины конец строки, а длина всей строки вам неизвестна:
local word = "sunflower"
print(word:sub(-1))
print(word:sub(-6))
print(word:sub(1, -7))Он выводит:
r
flower
sunПоследняя строка берёт всё от первого символа до седьмого с конца: слово без последних шести символов.
sub никогда не завершается ошибкой. Позиции за концом строки дают столько, сколько есть, а если между позициями ничего нет, получается пустая строка:
local word = "sunflower"
print(word:sub(5, 100))
print(word:sub(20) .. "|")Он выводит:
lower
|Методы возвращают новые строки, поэтому следующий метод можно вызвать прямо на результате. Так пишут слово с заглавной первой буквой: берут первый символ в верхнем регистре и присоединяют к нему остальное:
local name = "bella"
local nice = name:sub(1, 1):upper() .. name:sub(2)
print(nice)Он выводит:
Bellaname:sub(1, 1):upper() выполняется слева направо: сначала sub возвращает "b", потом upper делает из неё "B". А этот цикл проходит по всем символам по одному:
local word = "hen"
for i = 1, #word do
print(i, word:sub(i, i))
endОн выводит:
1 h
2 e
3 nТипичная ошибка: забыть, что вторая позиция включается. word:sub(1, 4) даёт четыре символа, "sunf", а не три. И, как и #, позиции считают байты, поэтому русская буква занимает две из них. Подробнее об этом ниже в этом уроке.
Задание
- 1
Каждая этикетка заканчивается датой сбора урожая, а дата всегда состоит из 10 символов. Возьмите её с помощью
subи отрицательной позиции, сохраните в переменнуюdateи выведитеДата: 2026-06-14. - 2
Название культуры — это всё, что стоит перед пробелом: этикетка без последних 11 символов (пробела и даты). Сохраните его в переменную
cropи выведите с заглавной первой буквой:Культура: Carrots. - 3
Покупатели Эммы привыкли записывать дату иначе: день, месяц и год через точки. Возьмите из
dateгод, месяц и день с помощьюsubи выведитеСобрано: 14.06.2026.