Строки
Строка — это последовательность символов. Имена игроков, команды, названия блоков, сообщения об ошибках, содержимое файлов — всё это строки. В Lua строки — полноценный тип данных с богатой библиотекой функций.
Создание строк
Строки можно задавать тремя способами:
local s1 = "двойные кавычки"
local s2 = 'одинарные кавычки'
local s3 = [[
многострочная
строка
]]
Внутри строки с двойными кавычками можно использовать одинарные и наоборот — это удобно когда нужны кавычки в тексте:
local msg = 'Он сказал: "Привет!"'
local cmd = "Введи 'help' для справки"
Иначе используй экранирование:
local msg = "Он сказал: \"Привет!\""
Базовые операции
Длина строки:
local name = "Nikita"
print(#name) -- 6
local empty = ""
print(#empty) -- 0
Склейка (конкатенация):
local first = "Добро"
local second = " пожаловать"
print(first .. second) -- Добро пожаловать
-- Числа в склейке конвертируются автоматически:
local score = 42
print("Счёт: " .. score) -- Счёт: 42
-- Но boolean и nil — нет, нужен tostring():
local active = true
print("Статус: " .. tostring(active)) -- Статус: true
Библиотека string
Все функции доступны двумя способами — через string.func(s) или как метод s:func():
local s = "Hello, World!"
-- Одно и то же:
print(string.upper(s))
print(s:upper())
Регистр
local s = "ComputerCraft"
print(s:upper()) -- COMPUTERCRAFT
print(s:lower()) -- computercraft
Длина
print(string.len("Привет")) -- 6
-- То же самое что #s, но через функцию
Извлечение подстроки
string.sub(s, i, j) — возвращает часть строки с позиции i до j. Отрицательные индексы считаются с конца:
local s = "minecraft:diamond_ore"
print(s:sub(1, 9)) -- minecraft
print(s:sub(11)) -- diamond_ore (до конца)
print(s:sub(-3)) -- ore (последние 3 символа)
Поиск
string.find(s, pattern) — возвращает начало и конец первого совпадения:
local s = "minecraft:diamond_ore"
local from, to = s:find("diamond")
if from then
print("Найдено с " .. from .. " по " .. to) -- Найдено с 11 по 17
else
print("Не найдено")
end
Извлечение по шаблону
string.match(s, pattern) — возвращает совпавшую часть:
local itemName = "minecraft:diamond_ore"
-- Извлечь только имя после двоеточия
local name = itemName:match(":(.+)$")
print(name) -- diamond_ore
-- Извлечь числа из строки
local s = "x=100 y=64 z=-250"
local x = s:match("x=(-?%d+)")
local y = s:match("y=(-?%d+)")
local z = s:match("z=(-?%d+)")
print(x, y, z) -- 100 64 -250
Основные символы шаблонов в Lua:
| Шаблон | Значение |
|---|
%d | Цифра |
%a | Буква |
%s | Пробельный символ |
%l | Строчная буква |
%u | Заглавная буква |
. | Любой символ |
+ | Один или более |
* | Ноль или более |
? | Ноль или один |
^ | Начало строки |
$ | Конец строки |
Замена
string.gsub(s, pattern, replacement) — заменяет все совпадения:
local s = "hello world"
local result = s:gsub("o", "0")
print(result) -- hell0 w0rld
-- Замена с функцией:
local names = "john, jane, bob"
local upper = names:gsub("%a+", function(word)
return word:sub(1,1):upper() .. word:sub(2)
end)
print(upper) -- John, Jane, Bob
Повтор и переворот
print(("abc"):rep(3)) -- abcabcabc
print(("abc"):rep(3, "-")) -- abc-abc-abc
print(("hello"):reverse()) -- olleh
Форматирование: string.format
string.format работает как printf в C — форматная строка с плейсхолдерами:
local name = "Nikita"
local score = 1234
local ratio = 0.8765
print(string.format("Игрок: %s", name))
print(string.format("Очки: %d", score))
print(string.format("Точность: %.1f%%", ratio * 100))
print(string.format("%-10s | %5d | %.2f", name, score, ratio))
Основные спецификаторы:
| Спецификатор | Значение |
|---|
%s | Строка |
%d | Целое число |
%f | Дробное число |
%.2f | Дробное с 2 знаками после запятой |
%5d | Число шириной 5 символов (правое выравнивание) |
%-10s | Строка шириной 10 (левое выравнивание) |
%02d | Число с ведущими нулями: 07 |
%% | Символ процента |
-- Форматирование времени:
local hours = 9
local minutes = 5
print(string.format("%02d:%02d", hours, minutes)) -- 09:05
-- Таблица с выравниванием:
local items = {
{name = "Diamond", count = 7},
{name = "Iron", count = 64},
{name = "Coal", count = 128},
}
for _, item in ipairs(items) do
print(string.format("%-10s %3d шт.", item.name, item.count))
end
Преобразование типов
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- Число → строка
local n = 42
local s = tostring(n) -- "42"
-- Строка → число (nil если не число)
local s = "123"
local n = tonumber(s) -- 123
local bad = "abc"
local fail = tonumber(bad) -- nil
-- Проверка типа
print(type("hello")) -- string
print(type(42)) -- number
print(type(true)) -- boolean
print(type(nil)) -- nil
print(type({})) -- table
Практика: разбор названия блока
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
local function parseItemName(fullName)
-- "minecraft:diamond_ore" → {mod="minecraft", item="diamond_ore"}
local mod, item = fullName:match("^(.+):(.+)$")
if not mod then
return {mod = "unknown", item = fullName}
end
-- "diamond_ore" → "diamond ore" → "Diamond Ore"
local readable = item:gsub("_", " "):gsub("%a+", function(w)
return w:sub(1,1):upper() .. w:sub(2)
end)
return {mod = mod, item = item, readable = readable}
end
local info = parseItemName("minecraft:diamond_ore")
print(info.mod) -- minecraft
print(info.item) -- diamond_ore
print(info.readable) -- Diamond Ore
🚀 Задания
Задание 1
Напиши функцию capitalize(s), которая делает первую букву заглавной, остальные — строчными. Проверь на "hELLO wORLD".
Задание 2
Напиши функцию countWords(s), которая считает количество слов в строке (слова разделены пробелами). Используй string.gsub или string.gmatch.
Задание 3
Напиши функцию truncate(s, maxLen): если строка длиннее maxLen — обрежь и добавь "...". Иначе — вернуть как есть.
Задание 4
Напиши форматтер инвентаря: для каждого непустого слота (1–16) выводи строку вида "[01] minecraft:diamond x 07" с фиксированной шириной колонок через string.format.
Задание 5
Напиши парсер конфигурации: строка вида "key=value". Функция parseConfig(line) должна вернуть ключ и значение. Обработай случай когда строка не содержит = — вернуть nil, "Некорректный формат".