2012-04-08 25 views
2

我必须用“\ item”替换所有这些字符,“①②③④⑤⑥⑦⑧⑨⑩”。如何用Lua中的单个词代替许多符号?

我已经使用这个代码:

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
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 manual了解范围以及一般情况下的Lua模式的信息。

你也可以是看中:

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

这将打开\item1\item2,等等。

2

在本教程中介绍使用“设置”:http://lua-users.org/wiki/PatternsTutorial

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

应该指出的是,Lua不处理Unicode。即使那些是UTF-8字符串,Lua也不会知道这一点。它会按原样查找每个UTF-8代码单元。原始代码工作的唯一原因是因为Lua正在寻找代码单元的*序列*。您在上面发布的内容将依次查找每个代码单元。 – 2012-04-08 01:48:14

2

有没有更简单,以取代所有这些项目的方式?

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

如果你正在使用一些非多字节编码,那么约翰建议可能会工作。但是,如果它是UTF-8的话。

针对您的特殊情况下,你总是可以做到这一点:

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

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