2013-08-07 28 views
5

Lua'da dizeleri işleyen bazı işlevlerle bir kitaplık yapmaya çalışıyorum. Harf büyük harfini yalnızca sözcüğün tek karakterleri üzerinde değiştiren bir işlev yapmak istiyorum.Lua'da String Manipulation: Tek karakterli büyük harf yap

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

ben "gsub" fonksiyonu ile çalıştı ama gerçekten zor kullanmak bulundu:

Bu

bir örnektir. Son zamanlarda Haskell çoğunlukla kodlama am yana

+2

Not: Örneğiniz ayrıca karakterleri küçük harfe dönüştürür! –

cevap

2

Birincisi, kelimelerin bir diziye dize bölmek c table.concat kullanarak, son olarak

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

: her kelime değiştirme fonksiyonunu kullanarak bir dizeye oncatenate:

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

Bu, karakter kümesi kodlamasının karakter başına yalnızca bir bayt olduğunu varsayar. Eğer durum böyle değilse, diğer her karakteri nasıl bulacağınız ile başlayan bir grup problemi ortaya çıkıyor. –

+0

@TomBlodget Lua dizesi bir bayt dizisidir. Lua’da Unicode’un işlenmesi burada cevap vermek için çok daha geniş bir konudur. –

1

, fonksiyonel-imsi çözüm akla gelen:

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 

Yasal Uyarı: Sadece fikri gösteren Test edilmedi.


Ve şimdi gerçek, sen [] referans semantik ile rasgele erişimli karakterlerin listesi gibi bir dize davranabilirsiniz. Dizin ile döngü için basit hile yapmak sadece iyi.

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 

: alt üst, hatta karakterlere beklenen, tuhaf karakterler gibi kelimeler çevirmek için bir işlev yapmak, Sonra

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

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

:

4

Bu neredeyse çalışır:

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

dize tek bir uzunlukta ve son karakter Ben

original = "This LIBRARY should work with any strings" 

gibi bir mektuptur zaman başarısız Bu davayı bir egzersiz olarak bırakacağım.

+4

'sonuç = giriş: gsub ('(% S) (% S?)', Işlev (a, b) dönüş a: üst() .. b: alt() uç)' tek uzunlukta başarısız olmaz. Btw, ben bu "göğüsler desen" çok seviyorum :-) –