Søgning efter og udtræk af delstrenge
Brug string.find og string.sub til at finde og udtrække tekst.
Søgning efter og udtræk af delstrenge er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.
Grundlæggende om string.find
string.find(s, pattern, init, plain) søger efter et mønster i s fra init (standardværdien er 1). Den returnerer matchningens start- og slutposition eller nil, hvis der ikke blev fundet noget. Med plain=true behandles mønsteret som en bogstavelig streng uden magiske tegn.
local s = "hello world"
local i, j = string.find(s, "world")
print(i, j) -- 7 11
-- Plain search (literal string)
local i2, j2 = string.find("a+b=5", "+", 1, true)
print(i2, j2) -- 2 2
-- Not found
print(string.find(s, "xyz")) -- nilstring.sub til udtræk
string.sub(s, i, j) udtrækker delstrengen fra position i til j (inklusive). Negative indeks tælles fra slutningen: -1 er det sidste tegn. Hvis j udelades, bruges slutningen af strengen som standard.
local s = "hello world"
print(string.sub(s, 1, 5)) -- hello
print(string.sub(s, 7)) -- world
print(string.sub(s, -5)) -- world
print(string.sub(s, 1, -7)) -- hello
print(s:sub(7, 11)) -- world (method syntax)Kombination af find og sub
Kombinér string.find og string.sub for at finde og udtrække delstrenge. Find først skilletegnet, og udtræk derefter delene omkring det. Det er den grundlæggende metode til at opdele strenge.
local s = "key=value"
local i = string.find(s, "=")
if i then
local key = string.sub(s, 1, i - 1)
local val = string.sub(s, i + 1)
print(key, val) -- key value
endstring.match til mønsterudtræk
string.match(s, pattern, init) returnerer de delstrenge, der blev fanget ved matchning af mønsteret. Hvis mønsteret ikke indeholder fangstgrupper, returnerer den hele matchningen. Hvis intet matcher, returnerer den nil. Fangstgrupper defineres med parenteser i mønsteret.
local date = "2024-03-15"
local y, m, d = string.match(date, "(%d+)-(%d+)-(%d+)")
print(y, m, d) -- 2024 03 15
-- No capture: returns the whole match
local num = string.match("price: 42.5 USD", "%d+%.%d+")
print(num) -- 42.5Find den sidste forekomst
Hvis du vil finde den sidste forekomst af en delstreng, kan du søge i en løkke, der flytter startpositionen frem, eller søge fra slutningen. Den almindelige metode er at kalde string.find igen og igen med positionen lige efter den forrige matchning, indtil den returnerer nil.
local function findLast(s, sub)
local last_i, last_j
local i, j = string.find(s, sub, 1, true)
while i do
last_i, last_j = i, j
i, j = string.find(s, sub, j + 1, true)
end
return last_i, last_j
end
local i, j = findLast("a/b/c/d", "/")
print(i, j) -- 6 6Udtræk af filendelser
En praktisk anvendelse af string.match er at udtrække endelsen fra et filnavn. Mønsteret "([^%.]+)$" fanger den sidste sekvens uden punktummer i slutningen af strengen, eller brug "%.([^%.]+)$" for kun at fange teksten efter det sidste punktum.
local function getExt(filename)
return string.match(filename, "%.([^%.]+)$")
end
print(getExt("photo.jpg")) -- jpg
print(getExt("archive.tar.gz")) -- gz
print(getExt("README")) -- nil
print(getExt("config.lua.bak")) -- bakOpdeling af strenge
Lua har ingen indbygget funktion til at opdele strenge, men du kan implementere en med string.gmatch. Gå gennem alle sekvenser, der ikke er skilletegn, eller brug et mønster, der fanger teksten mellem skilletegnene.
local function split(s, sep)
local result = {}
local pattern = "([^" .. sep .. "]+)"
for part in string.gmatch(s, pattern) do
result[#result+1] = part
end
return result
end
local parts = split("one,two,three,four", ",")
for i, p in ipairs(parts) do
print(i, p)
end
-- 1 one 2 two 3 three 4 fourFjernelse af mellemrum
Fjern indledende og afsluttende mellemrum ved at matche og kassere dem. Mønsteret "^%s*(.-)%s*$" bruger en doven kvantifikator .- til at fange det minimale indhold mellem valgfri indledende og afsluttende mellemrum.
local function trim(s)
return string.match(s, "^%s*(.-)%s*$")
end
print("|" .. trim(" hello ") .. "|") -- |hello|
print("|" .. trim(" \t\n") .. "|") -- ||
print("|" .. trim("no spaces") .. "|") -- |no spaces|Udtræk af tal fra tekst
Brug string.gmatch med et talmønster for at udtrække alle tal fra en streng. Mønsteret %-?%d+%.?%d* matcher et valgfrit minustegn, cifre, et valgfrit decimalpunktum og flere cifre.
local text = "Revenue: $1,234.56 Expenses: $567.89 Net: $666.67"
local numbers = {}
for n in string.gmatch(text, "%d+%.?%d*") do
numbers[#numbers+1] = tonumber(n)
end
for _, v in ipairs(numbers) do
io.write(v .. " ")
end
print() -- 1 234.0 56.0 567.89 666.67Normalisering af strengpositioner
Lua's negative indeks gør det muligt at arbejde fra slutningen af en streng. string.sub(s, -n) henter de sidste n tegn. Kombinér det med #s for at beregne positioner. Hvis du forstår forholdet mellem positive og negative indeks, undgår du fejl med forskydning på én.
local s = "abcdefgh"
-- Last 3 characters
print(s:sub(-3)) -- fgh
-- All but last 2
print(s:sub(1, -3)) -- abcdef
-- Character at position from end
print(s:sub(-1, -1)) -- h
print(s:sub(-4, -2)) -- efgHurtigt tjek
Hvad returnerer string.sub("hello", 2, -2)?
Opsummering: Søgning og udtræk
Opsummering:
string.find(s, pat, init, plain)— returnerer start, slut eller nilstring.sub(s, i, j)— udtrækker efter position; negative indeks tælles fra slutningenstring.match(s, pat)— returnerer fangstgrupper eller hele matchningen- Brug
plain=truetil bogstavelig søgning uden magiske tegn - Implementér opdeling med
string.gmatch - Fjern mellemrum med mønsteret
"^%s*(.-)%s*$"
Lær Lua med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 40
- Lektioner
- 159
Ofte stillede spørgsmål
Er lektionen “Søgning efter og udtræk af delstrenge” gratis?
Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Søgning efter og udtræk af delstrenge”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Søgning efter og udtræk af delstrenge”?
Brug string.find og string.sub til at finde og udtrække tekst. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Lua Academy?
Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Søgning efter og udtræk af delstrenge”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Lua Academy-lektion?
Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Grundlæggende strenghåndtering: sammenkædning og længde
- Søgning efter og udtræk af delstrenge
- string.format til output
- string.gsub og string.gmatch