script string lua lua-patterns

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