0Pricing
Lua Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы строк: объединение и длина
  2. Поиск и извлечение подстрок
  3. string.format для вывода
  4. string.gsub и string.gmatch
← Назад к Lua Academy