204 votes

Diviser une chaîne en Lua ?

Je dois faire une simple division d'une chaîne de caractères, mais il ne semble pas y avoir de fonction pour cela et la méthode manuelle que j'ai testée ne semble pas fonctionner. Comment pourrais-je le faire?

3 votes

6voto

krsk9999 Points 41

Vous pouvez utiliser cette méthode:

function string:split(delimiter)
  local result = { }
  local from  = 1
  local delim_from, delim_to = string.find( self, delimiter, from  )
  while delim_from do
    table.insert( result, string.sub( self, from , delim_from-1 ) )
    from  = delim_to + 1
    delim_from, delim_to = string.find( self, delimiter, from  )
  end
  table.insert( result, string.sub( self, from  ) )
  return result
end

delimiter = string.split(stringtodelimite,pattern)

6voto

Hohenheim Points 456

Une manière non vue chez les autres

fonction str_split(str, sep)
    if sep == nil then
        sep = '%s'
    end 

    local res = {}
    local func = function(w)
        table.insert(res, w)
    end 

    string.gsub(str, '[^'..sep..']+', func)
    return res 
end

6voto

Vous pourriez utiliser la bibliothèque Penlight. Celle-ci propose une fonction pour diviser une chaîne de caractères en utilisant un délimiteur qui renvoie une liste.

Elle a implémenté bon nombre des fonctions dont nous pourrions avoir besoin en programmation et qui manquent dans Lua.

Voici un exemple de son utilisation.

> 
> stringx = require "pl.stringx"
> 
> str = "bienvenue dans le monde de lua"
> 
> arr = stringx.split(str, " ")
> 
> arr
{bienvenue,dans,le,monde,de,lua}
>

5voto

Jerome Anthony Points 116

Simplement assis sur un délimiteur

local str = 'un,deux'
local regxEverythingExceptComma = '([^,]+)'
for x in string.gmatch(str, regxEverythingExceptComma) do
    print(x)
end

3voto

intrepidhero Points 21

J'ai utilisé les exemples ci-dessus pour concevoir ma propre fonction. Mais l'élément manquant pour moi était d'échapper automatiquement les caractères magiques.

Voici ma contribution:

function split(text, delim)
    -- retourne un tableau de champs basé sur le texte et le délimiteur (un seul caractère)
    local result = {}
    local magic = "().%+-*?[]^$"

    if delim == nil then
        delim = "%s"
    elseif string.find(delim, magic, 1, true) then
        -- échapper les caractères magiques
        delim = "%"..delim
    end

    local pattern = "[^"..delim.."]+"
    for w in string.gmatch(text, pattern) do
        table.insert(result, w)
    end
    return result
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X