2013-08-07 14 views
5

Sto provando a fare una libreria in Lua con alcune funzioni che manipolano le stringhe. Desidero eseguire una funzione che modifichi la maiuscola in maiuscolo solo sui caratteri dispari della parola.Manipolazione delle stringhe in Lua: Crea il carattere dispari maiuscolo

Questo è un esempio:

Input: This LIBRARY should work with any string! 
Result: ThIs LiBrArY ShOuLd WoRk WiTh AnY StRiNg! 

ho provato con la funzione "gsub", ma ho trovato davvero difficile da usare.

+2

Nota: l'esempio cambia anche i caratteri in minuscolo! –

risposta

2

Innanzitutto, dividere la stringa in un array di parole:

local original = "This LIBRARY should work with any string!" 

local words = {} 
for v in original:gmatch("%w+") do 
    words[#words + 1] = v 
end 

Quindi, effettuare una funzione di trasformare parole come previsto, caratteri dispari a superiori, anche caratteri inferiore:

function changeCase(str) 
    local u = "" 
    for i = 1, #str do 
     if i % 2 == 1 then 
      u = u .. string.upper(str:sub(i, i)) 
     else 
      u = u .. string.lower(str:sub(i, i)) 
     end 
    end 
    return u 
end 

Utilizzo della funzione per modificare ogni parola:

for i,v in ipairs(words) do 
    words[i] = changeCase(v) 
end 

Infine, utilizzando table.concat in c oncatenate a una stringa:

local result = table.concat(words, " ") 
print(result) 
-- Output: ThIs LiBrArY ShOuLd WoRk WiTh AnY StRiNg 
+1

Ciò presuppone che la codifica del set di caratteri abbia solo un byte per carattere. Se questo non è il caso, entrano in gioco alcuni problemi di gruppo, a cominciare da come trovare ogni altro personaggio. –

+0

@TomBlodget La stringa Lua è una sequenza di byte. L'elaborazione Unicode in Lua stessa è un argomento molto più ampio per rispondere qui. –

1

Dal momento che sto codifica per lo più in Haskell ultimamente, soluzione funzionale-ish viene in mente:

local function head(str) return str[1] end 
local function tail(str) return substr(str, 2) end 

local function helper(str, c) 
    if #str == 0 then 
     return "" 
    end 

    if c % 2 == 1 then 
     return toupper(head(str)) .. helper(tail(str),c+1) 
    else 
     return head(str) .. helper(tail(str), c+1) 
    end 
end 

function foo(str) 
    return helper(str, 1) 
end 

responsabilità: non testato, solo mostrando l'idea.


E ora per davvero, si può trattare di una stringa come un elenco di caratteri con accesso casuale con la semantica di riferimento su []. Semplice per il ciclo con indice dovrebbe fare il trucco bene.

4

Questo funziona quasi:

original = "This LIBRARY should work with any string!" 
print(original:gsub("(.)(.)",function (x,y) return x:upper()..y end)) 

fallisce quando la stringa ha lunghezza dispari e l'ultimo carattere è una lettera, come in

original = "This LIBRARY should work with any strings" 

I' Lasceremo quel caso come un esercizio.

+4

'result = input: gsub ('(% S) (% S?)', La funzione (a, b) restituisce a: upper() .. b: lower() end)' non fallirebbe sulla lunghezza dispari. A proposito, mi piace anche questo motivo "tette" :-) –

Problemi correlati