как избежать переменной в Lua - PullRequest
2 голосов
/ 15 июля 2011

есть ли способ избежать целой переменной в Lua?например:

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

Переменная «бла» изменяется и используется в другом месте в другом сопоставлении с образцом.Всякий раз, когда в «бла» есть магический персонаж, второе сопоставление с образцом, которое делается в другом месте, терпит неудачу.

Так что мне нужно обрабатывать экранирование как минимум различных магических символов в «бла».

Заранее спасибо!

Ответы [ 3 ]

8 голосов
/ 15 июля 2011

Самый простой способ - избежать всех знаков препинания и не беспокоиться о магических персонажах:

newpattern = string.gsub(pattern, "%p", "%%%1")
3 голосов
/ 15 июля 2011

Используйте эта функция :

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

  escape_lua_pattern = function(s)
    return (s:gsub(".", matches))
  end
end
3 голосов
/ 15 июля 2011

Немного неясно, что вы просите здесь: способ вызова экранирующей функции всякий раз, когда задается значение переменной, или как экранировать строку для сопоставления с образцом.

Переменная - это просто хранилище для значения. Вы не можете заставить общую операцию происходить, когда установлена ​​локальная переменная. Поэтому, если вы измените значение blah, вам придется снова корректно экранировать строку.

Если вы спрашиваете, как избежать строки для сопоставления с шаблоном, это будет примерно так:

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

Где ... - список символов, которые вам нужно экранировать. Справочное руководство Lua содержит список, который вы можете использовать. Обратите внимание, что, поскольку это шаблон, эти символы должны * экранироваться .

...