2013-08-07 8 views
5

Próbuję zrobić bibliotekę w Lua z jakąś funkcją, która manipuluje ciągami. Chcę wykonać funkcję, która zmienia wielkość liter na wielkie tylko na dziwne znaki tego słowa.Manipulacja ciągami w Lua: Utwórz nieparzystą wielką literę

To jest przykład:

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

Próbowałem z funkcją „gsub”, ale okazało się to naprawdę trudne do wykorzystania.

+2

Uwaga: Twój przykład również zmienia znaki na małe litery! –

Odpowiedz

2

pierwsze, podzielić ciąg na tablicę słów:

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

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

Następnie utworzyć funkcję, aby włączyć słowa jak oczekiwano, dziwnych znaków na wielkie, a nawet znaków dolna:

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 

Używanie funkcji do modyfikowania każdego słowa:

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

Wreszcie, przy użyciu table.concat do c oncatenate na jednej strunie:

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

Zakłada się, że kodowanie zestawu znaków ma tylko jeden bajt na znak. Jeśli tak nie jest, to pojawiają się problemy, zaczynając od znalezienia każdej innej postaci. –

+0

@TomBlodget Ciąg Lua to ciąg bajtów. Przetwarzanie Unicode w samej Lua to o wiele szerszy temat, na który można odpowiedzieć. –

1

Ponieważ jestem kodowania głównie w Haskell ostatnio, rozwiązanie funkcjonalno-owski przychodzi do głowy:

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 

Zastrzeżone: nie testowano, tylko pokazano ideę.


A teraz na poważnie można traktować ciąg jak listy znaków ze swobodnym dostępem z semantyki referencyjnych []. Prosta pętla z indeksem powinna wystarczyć.

4

To prawie działa:

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

To zawodzi, gdy łańcuch ma długość nieparzystą, a ostatni znak jest literą, tak jak w

original = "This LIBRARY should work with any strings" 

I” Zostawię tę sprawę jako ćwiczenie.

+4

'result = input: gsub ('(% S) (% S?)', Funkcja (a, b) zwraca a: upper() .. b: lower() end)' nie zawiedzie na nieparzystej długości. BTW, ja też lubię ten "wzór boobs" :-) –

Powiązane problemy