0Pricing
Lua Academy · Lekcja

string.gsub i string.gmatch

Proszę zastępować dopasowania wzorców w ciągach znaków i iterować po nich.

string.gsub i string.gmatch to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.

Podstawy string.gsub

string.gsub(s, pattern, repl, n) zastępuje dopasowania do pattern w s wartością repl, najwyżej n razy (domyślnie: wszystkie). Zwraca wynikowy napis oraz liczbę wykonanych zastąpień. Zastąpienie może być napisem, tabelą lub funkcją.

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

Odwołania do przechwyceń w zastąpieniu

W napisie zastępującym %1, %2 itd. odwołują się do przechwyceń we wzorcu. %0 oznacza całe dopasowanie. Można tego użyć do zmiany kolejności dopasowanego tekstu lub ujęcia go w dodatkowy tekst.

-- 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]

Funkcja jako zastąpienie

Gdy zastąpienie jest funkcją, gsub wywołuje ją dla każdego dopasowania (lub przechwycenia) i używa zwracanej wartości jako zastąpienia. Zwróć nil lub false, aby zachować oryginalne dopasowanie. Umożliwia to dynamiczne zastąpienia obliczane w trakcie działania programu.

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

Tabela jako zastąpienie

Gdy zastąpienie jest tabelą, gsub wyszukuje w niej każde dopasowanie (lub pierwsze przechwycenie) i używa znalezionej wartości. Jeśli wyszukiwanie zwróci nil lub false, oryginalne dopasowanie zostanie zachowane. To idealne rozwiązanie w przypadku słowników podstawień.

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

Podstawy string.gmatch

string.gmatch(s, pattern) zwraca iterator przechodzący po wszystkich dopasowaniach pattern w s. Każde wywołanie iteratora zwraca następne dopasowanie (lub przechwycenia, jeśli wzorzec je zawiera). To idiomatyczny sposób iterowania po dopasowaniach w 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

Tokenizacja za pomocą gmatch

Użyj string.gmatch do tokenizacji danych wejściowych: dzielenia według białych znaków, analizowania wierszy CSV lub wyodrębniania danych strukturalnych. Wzorzec określa, co ma zostać przechwycone; wszystko inne jest traktowane jako separator.

-- 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

Analizowanie parametrów URL

Analizuj napisy zapytań, iterując po parach klucz-wartość. Wzorzec ([^&=]+)=([^&]+) przechwytuje każdy klucz i wartość rozdzielone przez =, między separatorami &.

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

Usuwanie znaczników HTML

Częste zadanie związane z przetwarzaniem tekstu: usunięcie znaczników HTML z napisu. Użyj string.gsub ze wzorcem dopasowującym znaczniki otwierające i zamykające, a następnie zastąp je pustym napisem.

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)

Escapowanie znaków specjalnych wzorców

Znakami specjalnymi wzorców Lua są: . + * ? [ ] ^ $ % ( ). Aby dopasować je dosłownie, poprzedź je znakiem %. Jeśli używasz zwykłych napisów zawierających te znaki, przekaż true jako czwarty argument funkcji string.find, aby wyłączyć dopasowywanie wzorców.

-- 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

Zliczanie wystąpień

Użyj drugiej zwracanej wartości funkcji string.gsub (liczby zastąpień), aby zliczyć wystąpienia wzorca w napisie, nawet bez wykonywania żadnych zastąpień.

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

Szybkie sprawdzenie

Co zwraca string.gsub("hello", "l", "L")?

Podsumowanie: gsub i gmatch

Podsumowanie:

  • gsub(s, pat, repl, n) — zastępuje dopasowania; repl może być napisem, tabelą lub funkcją
  • %1...%n w napisach zastępujących odwołują się do przechwyceń
  • gmatch(s, pat) — iteruje po wszystkich dopasowaniach
  • Użyj %, aby escapować specjalne znaki wzorców: %., %+ itd.
  • Zliczanie wystąpień: druga zwracana wartość funkcji gsub

Często zadawane pytania

Czy lekcja „string.gsub i string.gmatch” jest bezpłatna?

Tak — pełny tekst „string.gsub i string.gmatch” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „string.gsub i string.gmatch”?

Proszę zastępować dopasowania wzorców w ciągach znaków i iterować po nich. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Lua Academy?

Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „string.gsub i string.gmatch”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?

Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy ciągów znaków: konkatenacja i długość
  2. Wyszukiwanie i wyodrębnianie podciągów
  3. string.format do formatowania wyjścia
  4. string.gsub i string.gmatch
← Powrót do Lua Academy