Экранирование строк для 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 и удалить строку "(\.)\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.


person theta    schedule 20.03.2012    source источник
comment
Чтобы экранировать символы шаблона в строке Lua в переменной, используйте эту функцию: github.com/lua-nucleo/lua-nucleo/blob/v0.1.0/lua-nucleo/   -  person Alexander Gladysh    schedule 21.03.2012


Ответы (4)


Согласно Программирование в Lua:

The character `%´ works as an escape for those magic characters. So, '%.' matches a dot; '%%' matches the character `%´ itself. You can use the escape `%´ not only for the magic characters, but also for all other non-alphanumeric characters. When in doubt, play safe and put an escape.

Разве это не означает, что вы можете просто поставить % перед каждым не буквенно-цифровым символом и все будет в порядке. Это также будет доказательством будущего (в случае введения новых специальных символов). Нравится:

function escape_pattern(text)
    return text:gsub("([^%w])", "%%%1")
end

У меня это сработало на Lua 5.3.2 (проводилось только элементарное тестирование). Не уверен, будет ли он работать со старыми версиями.

person FSMaxB    schedule 22.01.2016

Почему нет:

local quotepattern = '(['..("%^$().[]*+-?"):gsub("(.)", "%%%1")..'])'
string.quote = function(str)
    return str:gsub(quotepattern, "%%%1")
end

сбежать, а затем gsub это прочь?

person Qix - MONICA WAS MISTREATED    schedule 26.12.2013

пытаться

line = '"(\.)\n(\w)", r"\1 \2"'
rx =  '\"%(%\.%)%\n%(%\w%)\", r\"%\1 %\2\"'
print(string.gsub(line, rx, ""))

экранировать специальные символы с помощью% и кавычек с помощью \

person Mike Corcoran    schedule 20.03.2012
comment
Поскольку s в моем сценарии является переменной, а не жестко закодированной строкой, можете ли вы предоставить дополнительную информацию о том, какие символы необходимо экранировать для gsub? Я сделал функции для преобразования строки в последовательность байтов и обратно в качестве обходного пути, но затем обнаружил, что я не могу сказать Lua преобразовывать байт в строку во что-либо, кроме ASCII. - person theta; 21.03.2012
comment
см. справочное руководство по шаблонам, чтобы определить, что нужно избегать lua.org /manual/5.1/manual.html#5.4.1. в приведенном выше случае скобки и обратная косая черта являются специальными символами в том смысле, что они используются в схеме сопоставления с образцом для определения специальных конструкций (захватов или для обозначения специальных символов). - person Mike Corcoran; 21.03.2012

Попробуйте s=[["(\.)\n(\w)", r"\1 \2"]].

person lhf    schedule 20.03.2012
comment
Спасибо, но почему-то все равно не повезло - person theta; 20.03.2012
comment
Это сработает, если файл читается построчно и построчно по сравнению с s, но не с gsub - person theta; 20.03.2012