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

178voto

Voici ma solution vraiment simple. Utilisez la fonction gmatch() pour capturer les chaînes qui contiennent au moins un caractère de n'importe quoi d'autre que le séparateur désiré. Le séparateur est n'importe quel espace blanc (%s en Lua) par défaut :

function mysplit (inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local t={}
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                table.insert(t, str)
        end
        return t
end

75voto

Andrew Hare Points 159332

Veuillez consulter Diviser les chaînes de caractères:

Voici différentes façons de diviser une chaîne de caractères en une liste de sous-chaînes, en cassant la chaîne d'origine sur des occurrences d'un séparateur (caractère, ensemble de caractères ou motif). Cela est communément appelé une fonction de division de chaîne de caractères[2].

41voto

gwell Points 1702

Si vous divisez une chaîne de caractères en Lua, vous devriez essayer les méthodes string.gmatch() ou string.sub(). Utilisez la méthode string.sub() si vous connaissez l'index auquel vous souhaitez diviser la chaîne de caractères, ou utilisez string.gmatch() si vous allez analyser la chaîne pour trouver l'emplacement où diviser la chaîne.

Exemple utilisant string.gmatch() provenant du Manuel de Référence Lua 5.1:

 t = {}
 s = "from=world, to=Lua"
 for k, v in string.gmatch(s, "(%w+)=(%w+)") do
   t[k] = v
 end

0 votes

J'ai "emprunté" une implémentation de cette page lua-users merci quand même

30voto

Hugo Points 440

Si vous voulez simplement itérer sur les jetons, voici comment faire :

line = "un, deux et 3!"

for token in string.gmatch(line, "[^%s]+") do
   print(token)
end

Sortie :

un,

deux

et

3!

Brève explication : le motif "[^%s]+" correspond à chaque chaîne non vide entre les caractères d'espace.

4 votes

Le motif %S est égal à celui que vous avez mentionné, car %S est la négation de %s, tout comme %D est la négation de %d. De plus, %w est égal à [A-Za-z0-9_] (d'autres caractères pourraient être pris en charge en fonction de votre locale).

23voto

Si vous programmez en Lua, vous êtes malchanceux ici. Lua est LE langage de programmation qui se trouve être tristement célèbre car ses auteurs n'ont jamais implémenté la fonction "split" dans la bibliothèque standard, et ont plutôt écrit 16 écrans d'explications et de mauvaises excuses sur pourquoi ils ne l'ont pas fait et ne le feraient pas, entrecoupées de nombreux exemples à moitié fonctionnels qui sont pratiquement garantis de fonctionner pour presque tout le monde mais échouent dans votre cas particulier. C'est tout simplement l'état de l'art en Lua, et tout le monde qui programme en Lua se retrouve simplement à serrer les dents et à itérer sur les caractères. Il existe de nombreuses solutions qui sont parfois meilleures, mais exactement zéro qui sont de manière fiable meilleures.

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