string.gsub и string.gmatch
Заменяйте совпадения с шаблонами в строках и перебирайте их.
«string.gsub и string.gmatch» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Основы string.gsub
string.gsub(s, pattern, repl, n) заменяет совпадения pattern в s на repl до n раз (по умолчанию — все). Функция возвращает получившуюся строку и количество выполненных замен. В качестве замены можно использовать строку, таблицу или функцию.
local s = "hello world hello"
local result, count = string.gsub(s, "hello", "hi")
print(result) -- hi world hi
print(count) -- 2
-- Limit replacements
local r2 = string.gsub(s, "hello", "hi", 1)
print(r2) -- hi world helloСсылки на захваты в замене
В строке замены %1, %2 и другие обозначения ссылаются на захваты в шаблоне. %0 обозначает всё совпадение целиком. Используйте это, чтобы переставлять или обрамлять найденный текст.
-- Swap first and last name
local name = "Smith, John"
local swapped = string.gsub(name, "(%a+), (%a+)", "%2 %1")
print(swapped) -- John Smith
-- Wrap numbers in brackets
local text = "items: 3 and 7 total 10"
local tagged = string.gsub(text, "%d+", "[%0]")
print(tagged) -- items: [3] and [7] total [10]Функция в качестве замены
Если в качестве замены указана функция, gsub вызывает её для каждого совпадения (или захвата) и использует возвращённое значение как замену. Верните nil или false, чтобы сохранить исходное совпадение. Это позволяет выполнять динамические вычисляемые замены.
local env = {NAME="Lua", VERSION="5.4"}
local template = "Welcome to $NAME version $VERSION!"
local result = string.gsub(template, "%$(%w+)", env)
print(result) -- Welcome to Lua version 5.4!
-- Double each number
local s = "a1 b2 c3"
local r = string.gsub(s, "%d+", function(n)
return tostring(tonumber(n) * 2)
end)
print(r) -- a2 b4 c6Таблица в качестве замены
Если в качестве замены указана таблица, gsub ищет в ней каждое совпадение (или первый захват) и использует найденное значение. Если поиск возвращает nil или false, исходное совпадение сохраняется. Это идеально подходит для словарей замен.
local abbreviations = {
str = "string",
num = "number",
tbl = "table",
fn = "function",
}
local text = "A str can hold a num or a tbl"
local expanded = string.gsub(text, "%a+", abbreviations)
print(expanded)
-- A string can hold a number or a tableОсновы string.gmatch
string.gmatch(s, pattern) возвращает итератор по всем совпадениям pattern в s. Каждый вызов итератора возвращает следующее совпадение или захваты, если они есть в шаблоне. Это рекомендуемый в Lua способ перебора совпадений.
local s = "one=1 two=2 three=3"
-- Iterate all words
for word in string.gmatch(s, "%a+") do
io.write(word .. " ")
end
print() -- one two three
-- Iterate key=value pairs
for k, v in string.gmatch(s, "(%a+)=(%d+)") do
print(k, v)
endРазбор на элементы с помощью gmatch
Используйте string.gmatch для разбиения входных данных на элементы: разделяйте текст по пробельным символам, разбирайте строки CSV или извлекайте структурированные данные. Шаблон определяет, что нужно захватить; всё остальное считается разделителем.
-- Split by whitespace
local function tokenize(s)
local tokens = {}
for token in string.gmatch(s, "%S+") do
tokens[#tokens+1] = token
end
return tokens
end
local toks = tokenize(" hello world lua ")
for i, t in ipairs(toks) do
print(i, t)
end
-- 1 hello 2 world 3 luaРазбор параметров URL
Разбирайте строки запросов, перебирая пары «ключ—значение». Шаблон ([^&=]+)=([^&]+) захватывает каждый ключ и значение, разделённые символом = и находящиеся между разделителями &.
local url_params = "name=Alice&age=30&city=Istanbul"
local params = {}
for key, value in string.gmatch(url_params, "([^&=]+)=([^&]*)") do
params[key] = value
end
print(params.name) -- Alice
print(params.age) -- 30
print(params.city) -- IstanbulУдаление HTML-тегов
Распространённая задача обработки текста — удалить HTML-теги из строки. Используйте string.gsub с шаблоном, который находит открывающие и закрывающие теги, заменяя их на пустую строку.
local html = "<h1>Hello</h1> <p>World <b>bold</b></p>"
local plain = string.gsub(html, "<[^>]+>", "")
print(plain) -- Hello World bold
-- Replace <br> with newline
local html2 = "line1<br>line2<br/>line3"
local fixed = string.gsub(html2, "<br/?>", "\n")
print(fixed)Экранирование специальных символов
Специальные символы шаблонов Lua: . + * ? [ ] ^ $ % ( ). Чтобы сопоставлять их буквально, экранируйте их с помощью %. При использовании обычных строк с такими символами передайте true в качестве четвёртого аргумента string.find, чтобы отключить сопоставление по шаблону.
-- Escape a string for use in a pattern
local function escapePattern(s)
return (string.gsub(s, "[%(%)%.%%%+%-%*%?%[%^%$]", "%%%1"))
end
local query = "1+1=2"
local pattern = escapePattern(query)
print(string.find("result: 1+1=2", pattern, 1)) -- 9 13Подсчёт вхождений
Используйте второе возвращаемое значение string.gsub — количество замен — чтобы подсчитать вхождения шаблона в строке, даже если фактическая замена не выполняется.
local text = "banana"
local _, count = string.gsub(text, "a", "")
print("'a' appears " .. count .. " times") -- 3
-- Count words
local sentence = "the quick brown fox"
local _, wordCount = string.gsub(sentence, "%S+", "")
print("Words:", wordCount) -- 4Быстрая проверка
Что возвращает string.gsub("hello", "l", "L")?
Итоги: gsub и gmatch
Краткое повторение:
gsub(s, pat, repl, n)— заменяет; repl может быть строкой, таблицей или функцией%1…%nв строках замены ссылаются на захватыgmatch(s, pat)— перебирает все совпадения- Используйте
%для экранирования специальных символов шаблонов:%.,%+и т. д. - Количество вхождений — второе возвращаемое значение gsub
Часто задаваемые вопросы
Урок «string.gsub и string.gmatch» бесплатный?
Да — полный текст урока «string.gsub и string.gmatch» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «string.gsub и string.gmatch»?
Заменяйте совпадения с шаблонами в строках и перебирайте их. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «string.gsub и string.gmatch»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы строк: объединение и длина
- Поиск и извлечение подстрок
- string.format для вывода
- string.gsub и string.gmatch