Lua Academy · Oppitunti

Alimerkkijonojen etsiminen ja poimiminen

Paikantakaa ja poimikaa tekstiä string.find- ja string.sub-funktioilla.

Oppitunti 2/412 vaihetta

Alimerkkijonojen etsiminen ja poimiminen on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

string.find-funktion perusteet

string.find(s, pattern, init, plain) etsii merkkijonosta s kuviota alkaen kohdasta init (oletusarvo 1). Se palauttaa osuman alku- ja loppusijainnin tai nil-arvon, jos osumaa ei löydy. Kun plain=true, kuvio käsitellään literaalisena merkkijonona (ilman erikoismerkkejä).

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 poimimiseen

string.sub(s, i, j) poimii alimerkkijonon kohdasta i kohtaan j (molemmat mukaan lukien). Negatiiviset indeksit lasketaan lopusta: -1 on viimeinen merkki. Jos j jätetään pois, sen oletetaan tarkoittavan merkkijonon loppua.

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)

find- ja sub-funktioiden yhdistäminen

Yhdistäkää string.find ja string.sub alimerkkijonojen paikantamiseen ja poimimiseen. Etsikää ensin erotin ja poimikaa sitten sen ympärillä olevat osat. Tämä on merkkijonon jakamisen perusmenetelmä.

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 kuvion osien poimimiseen

string.match(s, pattern, init) palauttaa kuvioon täsmäävät poimitut merkkijonot. Jos kuviossa ei ole poimintoja, se palauttaa koko osuman. Jos mikään ei täsmää, se palauttaa nil-arvon. Poiminnat määritellään kuviossa sulkeilla.

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

Viimeisen esiintymän etsiminen

Alimerkkijonon viimeinen esiintymä voidaan etsiä silmukalla, joka siirtää aloituskohtaa, tai etsimällä lopusta alkaen. Tavallinen menetelmä on kutsua string.find-funktiota toistuvasti edellisen osuman jälkeisestä kohdasta alkaen, kunnes se palauttaa nil-arvon.

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

Tiedostopäätteiden poimiminen

string.match-funktion käytännöllinen sovellus on tiedostonimen päätteen poimiminen. Kuvio "([^%.]+)$" poimii viimeisen pisteettömän jakson merkkijonon lopusta, tai "%.([^%.]+)$" poimii vain viimeisen pisteen jälkeisen osuuden.

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

Merkkijonojen jakaminen

Luassa ei ole sisäänrakennettua merkkijonon jakamista, mutta voitte toteuttaa sen string.gmatch-funktion avulla. Käykää läpi kaikki erottimien väliset jaksot tai käyttäkää kuviota, joka poimii erottimien välistä.

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

Tyhjien merkkien poistaminen

Poistakaa alussa ja lopussa olevat tyhjät merkit etsimällä ja hylkäämällä ne. Kuvio "^%s*(.-)%s*$" käyttää laiskaa kvantifioijaa .- poimimaan vähimmäissisällön valinnaisten alussa ja lopussa olevien välilyöntien välistä.

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|

Lukujen poimiminen tekstistä

Käyttäkää string.gmatch-funktiota yhdessä lukukuvion kanssa poimiaksenne kaikki luvut merkkijonosta. Kuvio %-?%d+%.?%d* täsmää valinnaiseen miinusmerkkiin, numeroihin, valinnaiseen desimaalipisteeseen ja sitä seuraaviin numeroihin.

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

Merkkijonon sijaintien normalisointi

Luassa negatiivisten indeksien avulla voidaan työskennellä merkkijonon lopusta alkaen. string.sub(s, -n) palauttaa viimeiset n merkkiä. Yhdistäkää se #s-lausekkeeseen sijaintien laskemista varten. Positiivisten ja negatiivisten indeksien välisen suhteen ymmärtäminen auttaa välttämään yhden kohdan siirtymävirheitä.

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

Pikatarkistus

Mitä string.sub("hello", 2, -2) palauttaa?

Kertaus: etsiminen ja poimiminen

Yhteenveto:

  • string.find(s, pat, init, plain) — palauttaa alku- ja loppusijainnin tai nil-arvon
  • string.sub(s, i, j) — poimii sijainnin perusteella; negatiiviset indeksit lasketaan lopusta
  • string.match(s, pat) — palauttaa poimitut osat tai koko osuman
  • Käyttäkää plain=true literaaliseen hakuun (ei erikoismerkkejä)
  • Toteuttakaa jakaminen string.gmatch-funktion avulla
  • Poistakaa tyhjät merkit kuviolla "^%s*(.-)%s*$"
Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Alimerkkijonojen etsiminen ja poimiminen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Alimerkkijonojen etsiminen ja poimiminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Alimerkkijonojen etsiminen ja poimiminen”?

Paikantakaa ja poimikaa tekstiä string.find- ja string.sub-funktioilla. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Alimerkkijonojen etsiminen ja poimiminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Merkkijonojen perusteet: yhdistäminen ja pituus
  2. Alimerkkijonojen etsiminen ja poimiminen
  3. string.format tulostuksessa
  4. string.gsub ja string.gmatch
← Takaisin: Lua Academy