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