Lua Academy · Lektion

Søgning efter og udtræk af delstrenge

Brug string.find og string.sub til at finde og udtrække tekst.

Lektion 2 af 412 trin

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"))  -- nil

string.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
end

string.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.5

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

Udtræ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"))   -- bak

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

Fjernelse 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.67

Normalisering 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)) -- efg

Hurtigt 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 nil
  • string.sub(s, i, j) — udtrækker efter position; negative indeks tælles fra slutningen
  • string.match(s, pat) — returnerer fangstgrupper eller hele matchningen
  • Brug plain=true til bogstavelig søgning uden magiske tegn
  • Implementér opdeling med string.gmatch
  • Fjern mellemrum med mønsteret "^%s*(.-)%s*$"
Gratis at komme i gang

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

  1. Grundlæggende strenghåndtering: sammenkædning og længde
  2. Søgning efter og udtræk af delstrenge
  3. string.format til output
  4. string.gsub og string.gmatch
← Tilbage til Lua Academy