我正在嘗試在Lua中使用某些操作字符串的函數執行一個庫。 我想做一個函數,將字母大小寫更改爲只在單詞的奇數字符上。Lua中的字符串操作:使奇數字符大寫
這是一個例子:
Input: This LIBRARY should work with any string!
Result: ThIs LiBrArY ShOuLd WoRk WiTh AnY StRiNg!
我試圖與「GSUB」功能,但我發現它真的很難使用。
我正在嘗試在Lua中使用某些操作字符串的函數執行一個庫。 我想做一個函數,將字母大小寫更改爲只在單詞的奇數字符上。Lua中的字符串操作:使奇數字符大寫
這是一個例子:
Input: This LIBRARY should work with any string!
Result: ThIs LiBrArY ShOuLd WoRk WiTh AnY StRiNg!
我試圖與「GSUB」功能,但我發現它真的很難使用。
首先,分割字符串成單詞的數組:
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
這假設字符集編碼每個字符只有一個字節。如果情況並非如此,那麼一堆問題就會出現,從如何找到其他角色開始。 –
@TomBlodget Lua字符串是一個字節序列。在Lua中處理Unicode本身就是一個更爲廣泛的主題。 –
因爲我在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
免責聲明:沒有測試,只是顯示的想法。
現在真實的,你可以像對待與上[]
引用語義隨機訪問字符的列表的字符串。簡單的循環與索引應該做的伎倆就好了。
這幾乎工程:
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"
我」這失敗我將把這個案子作爲一個練習。
'result = input:gsub('(%S)(%S?)',函數(a,b)返回a:upper().. b:lower()end)'在奇數長度上不會失敗。順便說一句,我也喜歡這個「胸部模式」:-) –
注意:您的示例還會將字符更改爲小寫! –