Beaucoup de ces réponses n'acceptent que des séparateurs d'un seul caractère, ou ne gèrent pas bien les cas limites (par exemple, des séparateurs vides), c'est pourquoi j'ai pensé fournir une solution plus définitive.
Voici deux fonctions, gsplit
et split
, adaptées du code de l'extension Scribunto MediaWiki, qui est utilisée sur des wikis comme Wikipédia. Le code est sous licence GPL v2. J'ai changé les noms des variables et ajouté des commentaires pour rendre le code un peu plus compréhensible, et j'ai également modifié le code pour utiliser des motifs de chaînes de caractères Lua régulières au lieu des motifs de Scribunto pour les chaînes de caractères Unicode. Le code original comporte des cas de test ici.
-- gsplit: itérer sur des sous-chaînes dans une chaîne séparées par un motif
--
-- Paramètres:
-- text (string) - la chaîne sur laquelle itérer
-- pattern (string) - le motif de séparation
-- plain (booléen) - si vrai (ou vrai), le motif est interprété comme une
-- chaîne simple, pas un motif Lua
--
-- Renvoie : itérateur
--
-- Utilisation :
-- pour souschaine in gsplit(text, motif, simple) faire
-- faireQuelqueChose(souschaine)
-- fin
local function gsplit(text, pattern, plain)
local splitStart, length = 1, #text
return function ()
if splitStart then
local sepStart, sepEnd = string.find(text, pattern, splitStart, plain)
local ret
if not sepStart then
ret = string.sub(text, splitStart)
splitStart = nil
elseif sepEnd < sepStart then
-- Séparateur vide !
ret = string.sub(text, splitStart, sepStart)
if sepStart < length then
splitStart = sepStart + 1
else
splitStart = nil
end
else
ret = sepStart > splitStart and string.sub(text, splitStart, sepStart - 1) or ''
splitStart = sepEnd + 1
end
return ret
end
end
end
-- split: diviser une chaîne en sous-chaînes séparées par un motif.
--
-- Paramètres:
-- text (string) - la chaîne sur laquelle itérer
-- pattern (string) - le motif de séparation
-- plain (booléen) - si vrai (ou vrai), le motif est interprété comme une
-- chaîne simple, pas un motif Lua
--
-- Renvoie : table (une table de séquence contenant les sous-chaînes)
local function split(text, pattern, plain)
local ret = {}
for match in gsplit(text, pattern, plain) do
table.insert(ret, match)
end
return ret
end
Quelques exemples de l'utilisation de la fonction split
:
local function printSequence(t)
print(unpack(t))
end
printSequence(split('foo, bar,baz', ',%s*')) -- foo bar baz
printSequence(split('foo, bar,baz', ',%s*', true)) -- foo, bar,baz
printSequence(split('foo', '')) -- f o o
3 votes
Veuillez consulter Diviser les chaînes de caractères