2011-07-15 8 views
2

Luaの変数全体をエスケープする方法はありますか?以下のようになります。Luaの変数をエスケープするには

local blah = some_pattern 
string.gsub(blah, "-", "%-") 

変数「blah」が変更され、別のパターンマッチの他の場所で使用されます。 「ああ」の中に魔法のキャラクターがあるときはいつでも、それは他の場所で行われる第2のパターンマッチが失敗します。

だから私は、少なくとも "愚か者"で、さまざまな魔法のキャラクターをエスケープする必要があります。

ありがとうございます!

答えて

3

変数の値が設定されるたびにエスケープ関数を呼び出す方法、またはパターンマッチングのために文字列をエスケープする方法は、ここでは何を求めているのかは不明です。

変数は値の単なる記憶域です。ローカル変数が設定されていると、一般的な操作を実行することはできません。したがって、blahの値を変更した場合は、再度適切に文字列をエスケープする必要があります。 ...はあなたがエスケープする必要がある文字のリストである

blah = blah:gsub(blah, "([...])", "%%%1") 

:あなたはパターンマッチングのための文字列をエスケープする方法を求めている場合は

、それはこのようなものになるだろう。 Luaリファレンスマニュアルには、使用できるリストがあります。これはパターンなので、をここからエスケープする必要があります。

7

最も簡単な方法は、すべての句読点文字をエスケープすることであり、魔法の文字を心配していない:

newpattern = string.gsub(pattern, "%p", "%%%1") 
+0

それはすべきではない ' "%% 0"' ? –

+1

'%1'はうまく動作します。 – lhf

2

使用this function

local escape_lua_pattern 
do 
    local matches = 
    { 
    ["^"] = "%^"; 
    ["$"] = "%$"; 
    ["("] = "%("; 
    [")"] = "%)"; 
    ["%"] = "%%"; 
    ["."] = "%."; 
    ["["] = "%["; 
    ["]"] = "%]"; 
    ["*"] = "%*"; 
    ["+"] = "%+"; 
    ["-"] = "%-"; 
    ["?"] = "%?"; 
    } 

    escape_lua_pattern = function(s) 
    return (s:gsub(".", matches)) 
    end 
end