2013-08-07 32 views
5

我正在嘗試在Lua中使用某些操作字符串的函數執行一個庫。 我想做一個函數,將字母大小寫更改爲只在單詞的奇數字符上。Lua中的字符串操作:使奇數字符大寫

這是一個例子:

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

我試圖與「GSUB」功能,但我發現它真的很難使用。

+2

注意:您的示例還會將字符更改爲小寫! –

回答

2

首先,分割字符串成單詞的數組:

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

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

然後,使一個函數把像預期的,奇數字符上,即使字符的單詞到下:

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 

使用該函數修改每個單詞:

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

最後,使用table.concat將c oncatenate一個字符串:

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

這假設字符集編碼每個字符只有一個字節。如果情況並非如此,那麼一堆問題就會出現,從如何找到其他角色開始。 –

+0

@TomBlodget Lua字符串是一個字節序列。在Lua中處理Unicode本身就是一個更爲廣泛的主題。 –

1

因爲我在Haskell編碼大多是最近,功能十歲上下的解決方案浮現在腦海:

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 

免責聲明:沒有測試,只是顯示的想法。


現在真實的,你可以像對待與上[]引用語義隨機訪問字符的列表的字符串。簡單的循環與索引應該做的伎倆就好了。

4

這幾乎工程:

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

當字符串有奇數長度和最後一個字符是字母,如

original = "This LIBRARY should work with any strings" 

我」這失敗我將把這個案子作爲一個練習。

+4

'result = input:gsub('(%S)(%S?)',函數(a,b)返回a:upper().. b:lower()end)'在奇數長度上不會失敗。順便說一句,我也喜歡這個「胸部模式」:-) –