Aller au contenu principal
ShadowAcademy

Les langages / Lua / Chaines de caracteres

Patterns et expressions régulières

Lua utilise son propre système de patterns (motifs) pour la recherche et manipulation de texte. Bien que différent des regex classiques, il est très puissant et plus simple à apprendre.

Classes de caractères

local texte = "Lua 5.4 est sorti en 2020"

-- %d = chiffre, %a = lettre, %s = espace
local version = string.match(texte, "Lua %d%.%d")
print(version)  -- Lua 5.4

-- Extraire tous les nombres
for nombre in string.gmatch(texte, "%d+") do
  print(nombre)  -- 5, 4, 2020
end

-- %w = alphanumérique, %p = ponctuation
local mot = string.match("Hello, World!", "%a+")
print(mot)  -- Hello

Quantificateurs et captures

-- + = 1 ou plus, * = 0 ou plus, - = 0 ou plus (non-greedy)
local email = "contact@exemple.fr"
local user, domain = string.match(email, "([%w%.]+)@([%w%.]+)")
print("User:", user)      -- contact
print("Domain:", domain)  -- exemple.fr

-- Capturer plusieurs groupes
local date = "2024-03-15"
local annee, mois, jour = string.match(date, "(%d+)-(%d+)-(%d+)")
print(annee, mois, jour)  -- 2024 03 15

Validation de données

-- Vérifier un format
function estEmailValide(email)
  return string.match(email, "^[%w%.]+@[%w%.]+%.[%a]+$") ~= nil
end

print(estEmailValide("test@mail.com"))    -- true
print(estEmailValide("invalide"))         -- false

-- Vérifier un numéro de téléphone
function estTelephoneValide(tel)
  return string.match(tel, "^0%d %d%d %d%d %d%d %d%d$") ~= nil
end

print(estTelephoneValide("06 12 34 56 78"))  -- true

Nettoyage de texte

-- Supprimer les espaces en début/fin
function trim(s)
  return string.match(s, "^%s*(.-)%s*$")
end

print("[" .. trim("  Hello  ") .. "]")  -- [Hello]

-- Normaliser les espaces multiples
function normaliserEspaces(s)
  return string.gsub(s, "%s+", " ")
end

local texte = "Trop    d'espaces   ici"
print(normaliserEspaces(texte))  -- Trop d'espaces ici

2 exercices pour cette lecon

Les exercices demandent un compte : il faut bien enregistrer votre progression quelque part. La lecture, elle, reste libre. Creer un compte

  • Pattern matching basique difficile 35 XP
  • String.gsub pour remplacer difficile 35 XP