我正在尝试使用一些操作字符串的函数在 Lua 中创建一个库。我想做一个函数,仅在单词的奇数字符上将字母大小写更改为大写。
这是一个例子:
Input: This LIBRARY should work with any string!
Result: ThIs LiBrArY ShOuLd WoRk WiTh AnY StRiNg!
我尝试了“gsub”功能,但我发现它真的很难使用。
我正在尝试使用一些操作字符串的函数在 Lua 中创建一个库。我想做一个函数,仅在单词的奇数字符上将字母大小写更改为大写。
这是一个例子:
Input: This LIBRARY should work with any string!
Result: ThIs LiBrArY ShOuLd WoRk WiTh AnY StRiNg!
我尝试了“gsub”功能,但我发现它真的很难使用。
这几乎有效:
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"
我将把这个案例留作练习。
首先,将字符串拆分为单词数组:
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
连接到一个字符串:
local result = table.concat(words, " ")
print(result)
-- Output: ThIs LiBrArY ShOuLd WoRk WiTh AnY StRiNg
由于我最近主要在 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
免责声明:未经测试,仅展示想法。
现在,实际上,您可以将字符串视为具有随机访问的字符列表,引用语义 on []
。带有索引的简单 for 循环应该可以解决问题。