如何在 Lua 中用单词替换多个符号?

我必须将所有这些字符"①②③④⑤⑥⑦⑧⑨⑩"都替换成"\item"。我已经使用了以下代码:

    stra = string.gsub(text, "①", "\\item")
    strb = string.gsub(stra, "②", "\\item")
    strc = string.gsub(strb, "③", "\\item")
    strd = string.gsub(strc, "④", "\\item")
    stre = string.gsub(strd, "⑤", "\\item")

然而,这个方法很冗长。有没有更简单的方法可以替换所有这些字符?

原文链接 https://stackoverflow.com/questions/10059427

点赞
stackoverflow用户4323
stackoverflow用户4323

在教程中所描述的方式使用一个“集合”:http://lua-users.org/wiki/PatternsTutorial

string.gsub(text, "[①②③④⑤⑥⑦⑧⑨⑩]", "\\item")
2012-04-08 00:20:33
stackoverflow用户734069
stackoverflow用户734069

是否有一种更简单的方法来替换所有这些项?

如果没有一个了解 UTF-8 是什么的 Lua 模式匹配库,那就没有了。Lua 不了解 Unicode;它不知道如何搜索 Unicode 符号。

如果使用的是某种非多字节编码,则 John 建议可能有效。但如果是 UTF-8,则不行。

对于您特定的情况,您可以始终这样做:

local symbolsToChange { "â‘ ", "â‘¡", ...}

for i, sym in ipairs(symbolsToChange) do
  string.gsub(text, sym, "\\item")
end
2012-04-08 01:51:27
stackoverflow用户837856
stackoverflow用户837856
local symbols_trans = {
    ["\226\145\160"]--[[â‘ ]] = "\\item1",
    ["\226\145\161"]--[[â‘¡]] = "\\bananas",
    ["\226\145\162"]--[[â‘¢]] = "\\cactus",
    ["\226\145\163"]--[[â‘£]] = "\\etc",
    ["\226\145\164"]--[[⑤]] = "\\item5",
    ["\226\145\165"]--[[â‘¥]] = "\\item6",
    ["\226\145\166"]--[[⑦]] = "\\item7",
    ["\226\145\167"]--[[â‘§]] = "\\item8",
    ["\226\145\168"]--[[⑨]] = "\\item9",
    ["\226\145\169"]--[[â‘©]] = "\\item10",
}

text = string.gsub(text, "(\266\145.)", symbols_trans)

如果你想用 "\item" 替换所有项目符号:

text = string.gsub(text,
    "\266\145[\160-\169]",
    "\\item"
)

[\160-\169] 的等价于 [\160\161\162\163\164\165\166\167\168\169]。请参阅 Lua手册了解有关范围和Lua模式的信息。

你也可以更加花哨一些:

text = string.gsub(text,
    "\266\145([\160-169])",
    function(c)
        return "\\item"..(string.byte(c)-160+1)
    end
)

这将把â‘ 变成\item1â‘¡变成\item2,依此类推。

2012-04-08 06:52:06