【问题标题】:String Manipulation in Lua: Make the odd char uppercaseLua 中的字符串操作:将奇数字符变为大写
【发布时间】:2013-08-07 12:20:10
【问题描述】:

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

这是一个例子:

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

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

【问题讨论】:

  • 注意:您的示例还将字符更改为小写!

标签: string lua gsub lua-patterns


【解决方案1】:

这几乎可以工作:

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"

我将把这个案例留作练习。

【讨论】:

    【解决方案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
    

    【讨论】:

    • 这假定字符集编码每个字符只有一个字节。如果不是这样,那么就会出现一堆问题,首先是如何找到其他每个角色。
    • @TomBlodget Lua 字符串是一个字节序列。在 Lua 本身中处理 Unicode 是一个更广泛的主题,需要在这里回答。
    【解决方案3】:

    由于我最近主要使用 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 循环应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 2011-03-13
      • 1970-01-01
      • 2013-03-18
      • 2015-11-08
      • 2017-05-18
      • 1970-01-01
      • 2014-02-04
      • 2011-05-28
      相关资源
      最近更新 更多