Finne og hente ut delstrenger
Bruk string.find og string.sub til å finne og hente ut tekst.
Finne og hente ut delstrenger er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.
Grunnleggende om string.find
string.find(s, pattern, init, plain) søker etter et mønster i s, med start ved init (standardverdi 1). Den returnerer start- og sluttposisjonen for treffet, eller nil hvis det ikke ble funnet. Med plain=true behandles mønsteret som en bokstavelig streng (uten spesialtegn).
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 for uthenting
string.sub(s, i, j) henter delstrengen fra posisjon i til j (inkludert). Negative indekser telles fra slutten: -1 er det siste tegnet. Hvis j utelates, er standardverdien slutten av strengen.
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)Kombinere find og sub
Kombiner string.find og string.sub for å finne og hente ut delstrenger. Finn først skilletegnet, og hent deretter delene på hver side av det. Dette er den grunnleggende tilnærmingen til å dele opp strenger.
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 for mønsterfangst
string.match(s, pattern, init) returnerer delstrengene som fanges opp av mønsteret. Hvis mønsteret ikke har noen fangstgrupper, returneres hele treffet. Hvis ingenting samsvarer, returneres 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.5Finne siste forekomst
For å finne den siste forekomsten av en delstreng kan De søke i en løkke som flytter startposisjonen fremover, eller søke bakfra. Den vanlige fremgangsmåten er å fortsette å kalle string.find med posisjonen rett etter det forrige treffet, til 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 6Hente filendelser
En praktisk bruk av string.match er å hente filendelsen fra et filnavn. Mønsteret "([^%.]+)$" fanger opp den siste sekvensen uten punktum på slutten av strengen, eller "%.([^%.]+)$" for å fange opp teksten rett etter det siste punktumet.
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")) -- bakDele opp strenger
Lua har ingen innebygd funksjon for å dele opp strenger, men De kan implementere en med string.gmatch. Iterer over alle sekvenser som ikke er skilletegn, eller bruk et mønster som fanger opp teksten mellom skilletegn.
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 fourFjerne mellomrom
Fjern innledende og avsluttende mellomrom ved å finne og forkaste dem. Mønsteret "^%s*(.-)%s*$" bruker en lat kvantifikator .- til å fange opp det minste innholdet mellom eventuelle innledende og avsluttende mellomrom.
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|Hente ut tall fra tekst
Bruk string.gmatch med et tallmønster for å hente ut alle tall fra en streng. Mønsteret %-?%d+%.?%d* samsvarer med et valgfritt minustegn, sifre, et valgfritt desimalpunktum og flere sifre.
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 av strengposisjoner
Lua lar Dem bruke negative indekser for å arbeide fra slutten av en streng. string.sub(s, -n) henter de siste n tegnene. Kombiner dette med #s for å beregne posisjoner. Når De forstår forholdet mellom positive og negative indekser, unngår De feil med forskyvning 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)) -- efgHurtigsjekk
Hva returnerer string.sub("hello", 2, -2)?
Oppsummering: Finne og hente ut
Oppsummering:
string.find(s, pat, init, plain)– returnerer start, slutt eller nilstring.sub(s, i, j)– henter ut fra posisjon; negative indekser telles fra sluttenstring.match(s, pat)– returnerer fangstgrupper eller hele treffet- Bruk
plain=truefor bokstavelig søk (uten spesialtegn) - Implementer oppdeling med
string.gmatch - Fjern mellomrom med mønsteret
"^%s*(.-)%s*$"
Lær deg Lua med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 40
- Leksjoner
- 159
Ofte stilte spørsmål
Er leksjonen «Finne og hente ut delstrenger» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Finne og hente ut delstrenger», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Finne og hente ut delstrenger»?
Bruk string.find og string.sub til å finne og hente ut tekst. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Lua Academy?
Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Finne og hente ut delstrenger»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?
Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Grunnleggende om strenger: sammenføying og lengde
- Finne og hente ut delstrenger
- string.format for utdata
- string.gsub og string.gmatch