script - lua tokenize string
Dividir una cadena usando string.gmatch() en Lua (2)
Hay algunas discusiones aquí, y funciones de utilidad, para dividir cadenas, pero necesito un ad-hoc de una sola línea para una tarea muy simple.
Tengo la siguiente cadena:
local s = "one;two;;four"
Y quiero dividirlo en ";"
. Deseo, eventualmente, obtener { "one", "two", "", "four" }
a cambio.
Así que traté de hacer:
local s = "one;two;;four"
local words = {}
for w in s:gmatch("([^;]*)") do table.insert(words, w) end
Pero el resultado (la tabla de words
) es { "one", "", "two", "", "", "four", "" }
. Eso ciertamente no es lo que quiero.
Ahora, como señalé, hay algunas discusiones aquí sobre la división de cadenas, pero tienen funciones "largas" en ellas y necesito algo sucinto. Necesito este código para un programa donde muestro el mérito de Lua, y si agrego una función larga para hacer algo tan trivial, iría en mi contra.
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
resultado:
1 uno
2: dos
3: cuatro
local s = "one;two;;four"
local words = {}
for w in (s .. ";"):gmatch("([^;]*);") do
table.insert(words, w)
end
Al agregar uno extra ;
al final de la cadena, la cadena ahora se convierte en "one;two;;four;"
, todo lo que quieras capturar puede usar el patrón "([^;]*);"
para que coincida: cualquier cosa no ;
seguido por a ;
(codicioso).
Prueba:
for n, w in ipairs(words) do
print(n .. ": " .. w)
end
Salida:
1: one
2: two
3:
4: four