Alimerkkijonojen etsiminen ja poimiminen
Paikantakaa ja poimikaa tekstiä string.find- ja string.sub-funktioilla.
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")) -- nilstring.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
endstring.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.5Viimeisen 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 6Tiedostopää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")) -- bakMerkkijonojen 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 fourTyhjien 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.67Merkkijonon 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)) -- efgPikatarkistus
Mitä string.sub("hello", 2, -2) palauttaa?
Kertaus: etsiminen ja poimiminen
Yhteenveto:
string.find(s, pat, init, plain)— palauttaa alku- ja loppusijainnin tai nil-arvonstring.sub(s, i, j)— poimii sijainnin perusteella; negatiiviset indeksit lasketaan lopustastring.match(s, pat)— palauttaa poimitut osat tai koko osuman- Käyttäkää
plain=trueliteraaliseen hakuun (ei erikoismerkkejä) - Toteuttakaa jakaminen
string.gmatch-funktion avulla - Poistakaa tyhjät merkit kuviolla
"^%s*(.-)%s*$"
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
- Merkkijonojen perusteet: yhdistäminen ja pituus
- Alimerkkijonojen etsiminen ja poimiminen
- string.format tulostuksessa
- string.gsub ja string.gmatch