2012-04-08 4 views
2

「①②③④⑤⑥⑦⑧⑨⑩」の文字をすべて「\ item」に置き換える必要があります。私はこのコードを使用しているルアで多くのシンボルを1つの単語に置き換えるにはどうすればよいですか?

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パターンについては、Lua manualを参照してください。

また、空想のようになります。

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

は、このように \item2\item1を回す、となります。

2

は、チュートリアルで説明したように「設定」を使用しますhttp://lua-users.org/wiki/PatternsTutorial

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

LuaはUnicodeを処理しないことに注意してください。それらがUTF-8文字列であっても、Luaはそのことを知らないでしょう。各UTF-8コードユニットをそのまま検索します。元のコードが働いたのは、Luaがコードユニットの* sequence *を探していたからです。あなたが上に投稿したものは順番に各コードユニットを探します。 –

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 
関連する問題