我正在尝试在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)'在奇数长度上不会失败。顺便说一句,我也喜欢这个“胸部模式”:-) –
注意:您的示例还会将字符更改为小写! –