web-dev-qa-db-fra.com

Lua doit se séparer par virgule

J'ai googlé et je ne comprends tout simplement pas. Cela semble être une fonction si simple, mais bien sûr, Lua ne l’a pas.

En Python je ferais

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

et puis j'aurais deux variables, une = chat. deux = chien

Comment puis-je faire cela à Lua!?

24
Jaron Bradley

Si vous pouvez utiliser des bibliothèques, la réponse est (comme souvent en Lua) d'utiliser utilisez Penlight .

Si Penlight est trop lourd pour vous et que vous souhaitez simplement diviser une chaîne avec une virgule single comme dans votre exemple, vous pouvez procéder comme suit:

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

Essaye ça

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

'[^,]' signifie "tout sauf la virgule, le signe + signifie" un ou plusieurs caractères ". La parenthèse crée une capture (inutile dans ce cas).

51
marcus

Ajoutez cette fonction de partage en haut de votre page:

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

Ensuite, procédez comme suit:

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

Pour plus d'informations, visitez: Tutorial: Lua String Magic

Keep Coding ............... :)

14

- comme C strtok, divise un ou plusieurs caractères séparateurs (recherche toutes les chaînes ne contenant aucun des délimiteurs)

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

- exemple: var elements = split ("au revoir # au revoir, mademoiselle $ american @ pie", ", # $ @") -- renvoie "au revoir" "au revoir" "mademoiselle" "américaine"

3
Walt Howard

Voici comment je fais ça sur mediawiki:

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

en fait, si vous ne vous souciez pas des espaces, vous pouvez utiliser:

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

Des fonctions telles que string.split() sont largement inutiles dans Lua, car vous pouvezexprimer des opérations de chaîne dans LPEG . Si vous avez toujours besoin d'une fonction dédiée, une approche pratique estpour définir une fabrique de séparateurs (mk_splitter() dans l'extrait ci-dessous) duquel vous pouvez ensuite obtenir des séparateurs personnalisés.

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

L’avantage d’utiliser LPEG est que la fonction accepte comme argument les chaînes et les modèles Lua valides.

Voici comment vous l'utiliseriez pour créer une fonction qui divise les chaînes au caractère ,:

commasplitter = mk_splitter ","

print (commasplitter [[foo, bar, baz, xyzzy,]])
print (commasplitter [[a,b,c,d,e,f,g,h]])
0
Philipp Gesang

Pour gérer également les espaces optionnels, vous pouvez effectuer les tâches suivantes:

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

La sortie sera:

cat
dog
mouse
horse
0
Forivin