Lua中的字符串操作:将奇数字符转换为大写

我正在尝试用 Lua 做一个库,其中包含一些操作字符串的函数。

我想做一个函数,将单词中的奇数字符大小写更改为大写。

这是一个例子:

输入: This LIBRARY should work with any string!
输出: ThIs LiBrArY ShOuLd WoRk WiTh AnY StRiNg!

我尝试使用 "gsub" 函数,但我发现使用它非常困难。

点赞
用户752976
用户752976

由于我最近主要使用 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

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


现在来说实际的情况,你可以将字符串视为具有随机访问和引用语义的字符列表。简单的带索引的 for 循环就可以很好地解决问题。

2013-08-07 12:35:47
用户1009479
用户1009479

首先,将字符串分割成单词数组:

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)
-- 输出:ThIs LiBrArY ShOuLd WoRk WiTh AnY StRiNg
2013-08-07 13:06:50
用户107090
用户107090

这个几乎可以工作:

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"

我把那种情况留作练习。

2013-08-07 13:58:07