Splits een string met string.gmatch () in LUA

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 wordstabel) 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.

code hier

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

Other episodes