Замена в строке
Метод gsub (global substitution, «глобальная замена») заменяет каждую часть строки, подходящую под шаблон, другой строкой. Как и остальные строковые функции, он не меняет исходную строку, а возвращает новую. И возвращает ещё одно значение: сколько замен он сделал.
local note = "Fresh eggs, fresh milk"
print(note:gsub("fresh", "FRESH"))Он выводит:
Fresh eggs, FRESH milk 1Всего одна замена: Fresh с заглавной F — это другая строка. А после табуляции стоит счётчик, потому что print выводит все значения, которые получает. Чаще всего нужна только строка. Получить её можно тремя способами:
local note = "Fresh eggs, fresh milk"
print((note:gsub("eggs", "honey")))
local better = note:gsub("milk", "cheese")
print(better)
local loud, count = note:gsub("fresh", "FRESH")
print(loud, count)Он выводит:
Fresh honey, fresh milk
Fresh eggs, fresh cheese
Fresh eggs, FRESH milk 1Дополнительные скобки вокруг вызова оставляют только его первое значение. Одна переменная тоже сохраняет только первое значение, а с двумя переменными вы получаете оба. Скобки по-настоящему важны, когда результат передаётся в другую функцию, которая получила бы счётчик ещё одним аргументом. Второй аргумент tonumber — основание системы счисления (10 для обычных чисел), так что здесь будет ошибка:
local weight = "12 kg"
print(tonumber(weight:gsub(" kg", "")))main.lua:2: bad argument #2 to 'tonumber' (base out of range)А с tonumber((weight:gsub(" kg", ""))) всё работает.
Первый аргумент — шаблон, поэтому здесь работает всё, что вы узнали в двух последних упражнениях. Чтобы что-то удалить, замените это пустой строкой, "". Чтобы сжать серии пробелов, замените %s+ одним пробелом:
local note = "Eggs: 12, milk: 18"
print((note:gsub("%s+", " ")))
print((note:gsub("%d", "?")))Он выводит:
Eggs: 12, milk: 18
Eggs: ??, milk: ??Раз это шаблон, остерегайтесь магических символов. В России и во многих других странах десятичные дроби пишут через запятую, но замена "." заменяет каждый символ, потому что точка означает любой символ. %. — это сама точка:
print(("3.50"):gsub(".", ","))
print(("3.50"):gsub("%.", ","))Он выводит:
,,,, 4
3,50 1В строке замены % тоже особый символ: %1 подставляет то, что нашёл первый захват, %2 — второй и так далее. Так можно развернуть дату:
local date = "2026-06-14"
print((date:gsub("(%d+)-(%d+)-(%d+)", "%3.%2.%1")))Он выводит:
14.06.2026Счётчик полезен и сам по себе. Чтобы узнать, сколько раз слово встречается в строке, замените его самим собой и оставьте только счётчик: local _, times = note:gsub("eggs", "eggs").
Задание
- 1
Дедушка Джо не умеет писать слово potatoes. С помощью
gsubзамените каждоеpotatosнаpotatoesи выведите исправленное объявление, без счётчика:Fresh potatoes and eggs! Big potatoes for 3 coins. - 2
Выведите, сколько слов вы исправили, с помощью второго значения
gsub:Исправлено: 2. - 3
В объявлении ещё и слишком много пробелов. В исправленном объявлении замените каждую серию пробелов одним пробелом и выведите чистое объявление:
Fresh potatoes and eggs! Big potatoes for 3 coins.