Строки и операции над ними

Осваиваем работу с текстом — от простых кавычек до поиска и замены.

Строка — это последовательность символов, текст: имя игрока, сообщение в чате, путь к файлу.

Текст встречается повсюду: ник игрока, реплики персонажей, ключи в конфигах. Lua даёт богатый набор инструментов для работы со строками.

Три способа записать строку

local a = "двойные кавычки"
local b = 'одинарные кавычки'
local c = [[длинная строка,
может занимать несколько строк]]
print(c)

Вывод:

длинная строка,
может занимать несколько строк

Двойные квадратные скобки [[ ]] удобны для многострочного текста — например, для целого письма или фрагмента конфига.

Длина строки

Оператор # возвращает длину строки в байтах:

local word = "Roblox"
print(#word)

Вывод:

6

Библиотека string

Самые полезные функции живут в модуле string:

local s = "Hello, Lua"
print(string.upper(s))        -- в верхний регистр
print(string.sub(s, 1, 5))    -- подстрока: символы с 1 по 5
print(string.len(s))          -- длина

Вывод:

HELLO, LUA
Hello
10

В Lua символы нумеруются с единицы, а не с нуля — это важное отличие от многих языков!

Поиск и замена

local text = "score=100"
print(string.find(text, "="))         -- позиция знака равно
print(string.gsub(text, "100", "200")) -- замена

Вывод:

6	6
score=200	1

gsub возвращает не только новую строку, но и число выполненных замен.

Двоеточие как удобство

Вместо string.upper(s) можно писать s:upper() — это то же самое, но короче. Двоеточие подставляет саму строку первым аргументом.

Как работает под капотом

Строки в Lua неизменяемы: любая операция вроде upper не меняет исходную строку, а создаёт новую. Более того, Lua хранит одинаковые строки в единственном экземпляре (интернирование) — поэтому сравнение строк через == очень быстрое.

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

  • Считать символы с нуля. В Lua string.sub(s, 1, 1) — это первый символ.
  • Думать, что # считает символы. Для ASCII так и есть, но для кириллицы в UTF-8 он считает байты.
  • Ожидать, что upper изменит исходную строку. Строки неизменяемы — берите возвращённое значение.

Итог

  • Строки записываются в одинарных, двойных кавычках или [[ ]] для многострочного текста.
  • Оператор # даёт длину; нумерация символов начинается с единицы.
  • Модуль string содержит upper, sub, find, gsub и многое другое.
  • Строки неизменяемы — операции возвращают новые строки.
Проверьте себя
1. С какого индекса начинается нумерация символов в строке Lua?
AС нуля
BС единицы
CС минус единицы
DЗависит от длины строки
2. Что делает оператор # перед строкой, например #"Lua"?
AПревращает её в число
BВозвращает её длину
CУдаляет первый символ
DДелает её комментарием
3. Изменяет ли string.upper(s) исходную строку s?
AДа, меняет s на месте
BНет, строки неизменяемы — возвращается новая строка
CТолько если s локальная
DТолько в Lua 5.3