Экранирование строк для gsub

Я прочитал файл:

local logfile = io.open("log.txt", "r")
data = logfile:read("*a")
print(data)

вывод:

...
"(\.)\n(\w)", r"\1 \2"
"\n[^\t]", "", x, re.S
...

Да, лог-файл выглядит ужасно, так как он полон различных команд

Как я могу вызвать gsubи удалить строку ie "(\.)\n(\w)", r"\1 \2"из переменной данных?

Фрагмент ниже не работает:

s='"(\.)\n(\w)", r"\1 \2"'
data=data:gsub(s, '')

Я думаю, что нужно сделать некоторое экранирование. Любое простое решение?


Обновление:

local data = [["(\.)\n(\w)", r"\1 \2"
"\n[^\t]", "", x, re.S]]

local s = [["(\.)\n(\w)", r"\1 \2"]]

local function esc(x)
   return (x:gsub('%%', '%%%%')
            :gsub('^%^', '%%^')
            :gsub('%$$', '%%$')
            :gsub('%(', '%%(')
            :gsub('%)', '%%)')
            :gsub('%.', '%%.')
            :gsub('%[', '%%[')
            :gsub('%]', '%%]')
            :gsub('%*', '%%*')
            :gsub('%+', '%%+')
            :gsub('%-', '%%-')
            :gsub('%?', '%%?'))
end

print(data:gsub(esc(s), ''))

Кажется, это работает нормально, только мне нужно экранировать, escape-символ %, так как это не сработает, если %находится в совпадающей строке . Я пробовал :gsub('%%', '%%%%')или :gsub('\%', '\%\%'), но это не Работа.


Обновление 2:

ОК, %можно экранировать таким образом, если установить сначала в приведенной выше «таблице», которую я только что исправил

:ужасный опыт:

Обновление 3 :

Экранирование ^и $

Как указано в руководстве Lua ( 5.1, 5.2, 5.3 )

Символ вставки ^в начале шаблона закрепляет совпадение в начале строки темы. $в конце шаблона закрепляет совпадение в конце строки темы. В других позициях ^и $не имеют особого значения и представляют сами себя.

Поэтому лучше экранировать ^и $только тогда, когда они найдены (соответственно) и в начале или в конце строки.

Несовместимость Lua 5.1 - 5.2+

string.gsubтеперь вызывает ошибку, если строка замены содержит %, за которым следует символ, отличный от разрешенного %или цифра.

Нет необходимости удваивать каждый %в замещающей строке. См. lua-users.

6
задан Antonin Décimo 20 January 2016 в 13:53
поделиться