Stringhe in Lua
Le stringhe in Lua sono sequenze immutabili di byte utilizzate per rappresentare testo. Lua offre una ricca libreria di funzioni per la loro manipolazione. In questa guida esploreremo la creazione, le sequenze di escape e le principali funzioni della libreria string.
Creazione di Stringhe
Lua offre tre modi per creare stringhe: apici singoli, apici doppi e long strings con [[ ]]:
local saluto = 'Ciao, mondo!'
local messaggio = "Benvenuto in Lua"
local testo_lungo = [[
Questo testo si estende su
piu righe senza sequenze di escape.
]]
Le long strings supportano anche livelli con = per evitare conflitti: [=[ testo con ]] ]=].
Sequenze di Escape
Le stringhe tra apici supportano sequenze di escape come \n (nuova riga), \t (tabulazione), \\ (backslash), \" e \' (apici), \97 (codice decimale) e \x41 (codice esadecimale):
print("Prima riga\nSeconda riga")
print("Colonna1\tColonna2")
print("Disse: \"Ciao!\"")
Concatenazione e Lunghezza
Le stringhe si concatenano con .. e la lunghezza si ottiene con # o string.len:
local nome_completo = "Mario" .. " " .. "Rossi"
print(#nome_completo) -- 11
print("Ho " .. 30 .. " anni") -- conversione automatica dei numeri
Maiuscole, Minuscole e Inversione
local frase = "Ciao Mondo"
print(string.upper(frase)) -- CIAO MONDO
print(string.lower(frase)) -- ciao mondo
print(frase:upper()) -- sintassi alternativa con i due punti
print(string.reverse("Lua")) -- auL
Sottostringhe con string.sub
Estrae porzioni di stringa. Gli indici partono da 1; quelli negativi contano dalla fine:
local testo = "Programmazione Lua"
print(string.sub(testo, 1, 15)) -- Programmazione
print(string.sub(testo, -3)) -- Lua
print(testo:sub(1, 1)) -- P (primo carattere)
Ripetizione con string.rep
print(string.rep("Lua ", 3)) -- Lua Lua Lua
print(string.rep("-", 20)) -- --------------------
print(string.rep("ab", 3, ", ")) -- ab, ab, ab
Ricerca con string.find
Cerca un pattern e restituisce le posizioni di inizio e fine della corrispondenza:
local frase = "Ciao mondo, benvenuto in Lua"
local inizio, fine = string.find(frase, "mondo")
print(inizio, fine) -- 6 10
print(string.find(frase, "Python")) -- nil
-- Ricerca letterale (senza pattern) con quarto parametro true
print(string.find("100%", "%%", 1, true)) -- 4
Sostituzione con string.gsub
Sostituisce le occorrenze di un pattern. Restituisce la nuova stringa e il conteggio:
local testo = "Lua e bello. Lua e potente."
print(string.gsub(testo, "Lua", "Python"))
-- Python e bello. Python e potente. 2
local nuovo, n = string.gsub(testo, "Lua", "Python", 1)
print(nuovo) -- Python e bello. Lua e potente.
print(n) -- 1
Formattazione con string.format
Crea stringhe formattate con specificatori %s (stringa), %d (intero), %f (decimale), %x (esadecimale):
print(string.format("Nome: %s, Eta: %d", "Lucia", 25))
print(string.format("Prezzo: %.2f EUR", 19.99))
print(string.format("Hex: %x", 255)) -- ff
print(string.format("|%-15s|%5d|", "Articolo", 42))
Conversione tra Byte e Caratteri
Le funzioni string.byte e string.char convertono tra caratteri e codici numerici:
print(string.byte("A")) -- 65
print(string.byte("ABC", 1, 3)) -- 65 66 67
print(string.char(76, 117, 97)) -- Lua
Conversione tra Stringhe e Numeri
local str = tostring(42) -- "42"
local num = tonumber("3.14") -- 3.14
print(tonumber("abc")) -- nil (conversione fallita)
print(tonumber("FF", 16)) -- 255 (base esadecimale)
print("10" + 5) -- 15 (conversione automatica)
print("10" .. 5) -- 105 (concatenazione)
Conclusioni
La libreria string di Lua offre funzioni complete per la manipolazione del testo. La sintassi con i due punti (str:upper()) rende il codice leggibile, e la conversione automatica tra stringhe e numeri semplifica le operazioni comuni. Ricorda che le stringhe sono immutabili: ogni operazione crea una nuova stringa.