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

时间:2012-04-08 00:14:39

标签: lua replace

我必须用“\ 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")

然而,这非常冗长。是否有更简单的方法来替换所有这些项目?

3 个答案:

答案 0 :(得分:3)

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.)", symbol_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 manual

你也可能很想要:

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

这会将变为\item1,将变为\item2,依此类推。

答案 1 :(得分:2)

使用教程中描述的“set”:http://lua-users.org/wiki/PatternsTutorial

string.gsub(text, "[①②③④⑤⑥⑦⑧⑨⑩]", "\\item")

答案 2 :(得分:2)

  

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

不是没有知道UTF-8是什么的Lua模式匹配库。 Lua不支持Unicode;它不知道如何搜索Unicode符号。

如果您正在使用某些非多字节编码,那么John建议可能会有效。但不是如果它是UTF-8。

对于您的具体情况,您可以随时执行此操作:

local symbolsToChange { "①", "②", ...}

for i, sym in ipairs(symbolsToChange) do
  string.gsub(text, sym, "\\item")
end