Lua中的String Manipulation:将奇数char设为大写

时间:2013-08-07 12:20:10

标签: string lua gsub lua-patterns

我正在尝试使用一些操作字符串的函数在Lua中创建一个库。 我想做一个函数,只在单词的奇数字符上将字母大小写改为高位。

这是一个例子:

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

我尝试使用“gsub”功能,但我发现它很难使用。

3 个答案:

答案 0 :(得分: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"

我会把这个案子作为练习。

答案 1 :(得分: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连接到一个字符串:

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

答案 2 :(得分: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

免责声明:未经测试,只是展示了这个想法。


现在,对于实际情况,您可以使用[]上的引用语义来处理类似于字符列表的字符串。简单的索引循环应该可以正常使用。