Экранирующие строки для gsub - PullRequest
5 голосов
/ 20 марта 2012

Я читаю файл:

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), ''))

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


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

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

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

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

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

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

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

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

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

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

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

Ответы [ 4 ]

6 голосов
/ 26 декабря 2013

Почему бы и нет:

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

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

5 голосов
/ 22 января 2016

Согласно Программирование на 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 (было проведено только элементарное тестирование).Не уверен, что он будет работать со старыми версиями.

2 голосов
/ 21 марта 2012

1001 * попробовать *

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

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

1 голос
/ 20 марта 2012

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

...