Er zijn hier enige discussies en utiliteitsfuncties, voor het splitsen van snaren, maar ik heb een ad-hoc een-voering nodig voor een zeer eenvoudige taak.
Ik heb de volgende tekenreeks:
local s = "one;two;;four"
en ik wil het opsluiten op ";"
. Ik wil uiteindelijk { "one", "two", "", "four" }
in ruil daarvoor.
Dus ik probeerde te doen:
local s = "one;two;;four"
local words = {}
for w in s:gmatch("([^;]*)") do table.insert(words, w) end
Maar het resultaat (de words
tabel) is { "one", "", "two", "", "", "four", "" }
. Dat is zeker niet wat ik wil.
Nu, zoals ik opmerkte, er zijn hier enkele discussies op het splitsen van snaren, maar ze hebben “langdurige” functies in hen en ik heb iets verknoopt. Ik heb deze code nodig voor een programma waar ik de verdienste van Lua laat zien, en als ik een langdurige functie toevoeg om iets zo triviaals te doen, zou het tegen me gaan.
Antwoord 1, Autoriteit 100%
local s = "one;two;;four"
local words = {}
for w in (s .. ";"):gmatch("([^;]*);") do
table.insert(words, w)
end
Door een extra ;
aan het einde van de string toe te voegen, wordt de tekenreeks "one;two;;four;"
, alles wat u wilt vastleggen Het patroon "([^;]*);"
APPARER: Alles wat niet ;
gevolgd door een ;
(hebzuchtig).
Test:
for n, w in ipairs(words) do
print(n .. ": " .. w)
end
Uitgang:
1: one
2: two
3:
4: four
Antwoord 2
Gewoon * naar + werken wijzigen.
local s = "one;two;;four"
local words = {}
for w in s:gmatch("([^;]+)") do
table.insert(words, w)
print(w)
end
Het magische karakter * vertegenwoordigt 0 of meer voorkomen, dus wanneer het aankomt ‘,’, beschouwde Lua het als een lege tekenreeks die [^;] niet bestaat.
Sorry voor mijn onvoorzichtigheid, de words[3]
zou een lege touw moeten zijn, maar wanneer ik de originele code in LUA5.4-tolk uitvoert, werkt alles.
Running resultaat hier
(Ik moet links plaatsen vanwege een gebrek aan reputatie)
Antwoord 3
function split(str,sep)
local array = {}
local reg = string.format("([^%s]+)",sep)
for mem in string.gmatch(str,reg) do
table.insert(array, mem)
end
return array
end
local s = "one;two;;four"
local array = split(s,";")
for n, w in ipairs(array) do
print(n .. ": " .. w)
end
Resultaat:
1: één
2: twee
3: vier