script lua split match

script - Lua necesita dividirse en coma



lua string match (7)

- como C strtok, se divide en uno de los caracteres delimitadores más (encuentra cada cadena que no contiene ninguno de los delimitadores)

function split(source, delimiters) local elements = {} local pattern = ''([^''..delimiters..'']+)'' string.gsub(source, pattern, function(value) elements[#elements + 1] = value; end); return elements end

- ejemplo: var elements = split ("bye # bye, miss $ american @ pie", ", # $ @") - devuelve "bye" "bye" "miss" "american" "pie"

He buscado en Google y no lo entiendo. Parece una función tan simple, pero, por supuesto, Lua no la tiene.

En Python lo haría

string = "cat,dog" one, two = string.split(",")

y luego tendría dos variables, una = cat. dos = perro

¿Cómo hago esto en Lua?


Así es como hago eso en mediawiki:

str = "cat,dog" local result = mw.text.split(str,"%s*,%s*") -- result[0] will give "cat", result[1] will give "dog"

En realidad, si no te importan los espacios, puedes usar:

str = "cat,dog" local result = mw.text.split(str,",") -- result[0] will give "cat", result[1] will give "dog"


Las funciones como string.split() son en gran medida innecesarias en Lua, ya que puede expresar las operaciones de cadena en LPEG . Si aún necesita una función dedicada, un enfoque conveniente es definir una fábrica de divisores ( mk_splitter() en el siguiente fragmento de mk_splitter() ) desde la cual puede derivar divisores personalizados.

local lpeg = require "lpeg" local lpegmatch = lpeg.match local P, C = lpeg.P, lpeg.C local mk_splitter = function (pat) if not pat then return end pat = P (pat) local nopat = 1 - pat local splitter = (pat + C (nopat^1))^0 return function (str) return lpegmatch (splitter, str) end end

La ventaja de usar LPEG es que la función acepta tanto cadenas como patrones válidos de Lua como argumento.

Aquí es cómo lo usaría para crear una función que divide cadenas en el carácter ,

commasplitter = mk_splitter "," print (commasplitter [[foo, bar, baz, xyzzy,]]) print (commasplitter [[a,b,c,d,e,f,g,h]])


Para manejar también el espacio en blanco opcional puedes hacer:

str = "cat,dog,mouse, horse" for word in str:gmatch(''[^,%s]+'') do print(word) end

La salida será:

cat dog mouse horse


Prueba esto

str = ''cat,dog'' for word in string.gmatch(str, ''([^,]+)'') do print(word) end

''[^,]'' significa "todo menos la coma, el signo + significa" uno o más caracteres ". El paréntesis crea una captura (no es realmente necesario en este caso).


Si puede usar bibliotecas, la respuesta es (como suele ocurrir en Lua) usar Penlight .

Si Penlight es demasiado pesado para ti y solo quieres dividir una cadena con una sola coma como en tu ejemplo, puedes hacer algo como esto:

string = "cat,dog" one, two = string:match("([^,]+),([^,]+)")


Agregue esta función de división en la parte superior de su página:

function string:split( inSplitPattern, outResults ) if not outResults then outResults = { } end local theStart = 1 local theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart ) while theSplitStart do table.insert( outResults, string.sub( self, theStart, theSplitStart-1 ) ) theStart = theSplitEnd + 1 theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart ) end table.insert( outResults, string.sub( self, theStart ) ) return outResults end

Luego haz lo siguiente:

local myString = "Flintstone, Fred, 101 Rockledge, Bedrock, 98775, 555-555-1212" local myTable = myString:split(", ") for i = 1, #myTable do print( myTable[i] ) -- This will give your needed output end

Para más información, visite: Tutorial: Lua String Magic

Mantener la codificación ............... :)