在 Lua 中将每个单词的首字母大写

我可以使用以下代码将字符串的第一个字母大写:

str:gsub("^%l", string.upper)

我该如何修改此代码以使字符串中每个单词的第一个字母都大写?

点赞
用户2001870
用户2001870

我找不到任何花哨的方式来做到这一点。

str = "here you have a long list of words"
str = str:gsub("(%l)(%w*)", function(a,b) return string.upper(a)..b end)
print(str)

此代码的输出是_Here You Have A Long List Of Words_。%w *可以更改为%w +以不替换单字母的单词。


更新的解决方案:

str = string.gsub(" "..str, "%W%l", string.upper):sub(2)

由于Lua的模式系统简单,因此无法进行真正的单个正则表达式替换。

2013-11-29 11:43:58
用户2397883
用户2397883

在列出的备选答案中,如果单词中带有撇号,则会得到不一致的结果:

str = string.gsub(" "..str, "%W%l", string.upper):sub(2) 将在每个省略号后的第一个字母大写,无论它是否是单词的第一个字母

例如:“here's a long list of words”输出“Here'S A Long List Of Words”

要解决此问题,我在[这里找到了一个聪明的解决方法](http://coronalabs.com/blog/2013/04/16/lua-string-magic/)

利用此代码:

function titleCase( first, rest )
   return first:upper()..rest:lower()
end

string.gsub(str, "(%a)([%w_']*)", titleCase)

将解决由这个奇怪的错误引起的任何问题

2014-03-21 01:51:16
用户4038287
用户4038287
# 将字符串的每个单词首字母大写

```lua
function titleCase( first, rest )
   return first:upper()..rest:lower()
end

string.gsub(str, "(%a)([%w_']*)", titleCase)

BunchOfText {"Yeppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp"} ```

2014-09-13 18:32:02
用户11192546
用户11192546

我有一种感觉,当我需要将某些东西放入适当的标题案例中时,我将回到这个问题。

以下是执行此操作的 Lua 代码。 它有不保留单词之间原始空格的缺点,但现在已经足够。

-- Lua 在语法上类似于 Python,并且像 C 一样基础
function Set (list)
    local set = {}
    for _, l in ipairs(list) do set[l] = true end
    return set
end

function firstToUpper(str)
    return (str:gsub("^%l", string.upper))
end

function titlecase(str)
    -- 我们需要将字符串分隔成单词
    words = {}
    for word in string.gmatch(str, '([^%s]+)') do
        table.insert(words, word)
    end

    -- 我们需要将不是以下内容的任何内容大写:
    --   - 冠词
    --   - 并列连词
    --   - 介词
    -- 因此,我们有这样的黑名单
    local blacklist = Set {
        "at", "but", "by", "down", "for", "from",
        "in", "into", "like", "near", "of", "off",
        "on", "onto", "out", "over", "past", "plus",
        "to", "up", "upon", "with", "nor", "yet",
        "so", "the"
    }
    for index, word in pairs(words) do
        if(not (blacklist[word] ~= nil)) then
            words[index] = firstToUpper(word)
        end
    end

    -- 第一个和最后一个单词始终大写
    words[1] = firstToUpper(words[1])
    words[#words] = firstToUpper(words[#words])

    -- 通过空格字符连接列表中的元素
    local result = ""
    for index, word in pairs(words) do
        result = result .. word
        if(index ~= #words) then
            result = result .. ' '
        end
    end
    return result
end

print(titlecase("the world"))
print(titlecase("I walked my dog this morning ..."))
print(titlecase("The art of Lua"))

--- 输出:
----------------------
--- The World
--- I Walked My Dog This Morning ...
--- The Art of Lua
2022-03-26 22:17:13