#string #lua #escaping
#строка #lua #экранирование
Вопрос:
Следующие строки представляют собой произвольное регулярное выражение, которое мне нужно использовать в lua.
['";=]
!^(?:(?:[a-z]{3,10}s (?:w{3,7}?://[w-./]*(?::d )?)?/[^?#]*(?:?[^#s]*)?(?:#[S]*)?|connect (?:d{1,3}.){3}d{1,3}.?(?::d )?|options *)s [w./] |get /[^?#]*(?:?[^#s]*)?(?:#[S]*)?)$
'(?i:(?:c(?:o(?:n(?:t(?:entsmartz|actbot/)|cealed defense|veracrawler)|mpatible(?: ;(?: msie|.)|-)|py(?:rightcheck|guard)|re-project/1.0)|h(?:ina(?: local browse 2.|claw)|e(?:rrypicker|esebot))|rescent internet toolpak)|w(?:e(?:b(?: (?:downloader|by mail)|(?:(?:altb|ro)o|bandi)t|emailextract?|vulnscan|mole)|lls search ii|p Search 00)|i(?:ndows(?:-update-agent| xp 5)|se(?:nut)?bot)|ordpress(?: hash grabber|/4.01)|3mir)|m(?:o(?:r(?:feus fucking scanner|zilla)|zilla/3.mozilla/2.01$|siac 1.)|i(?:crosoft (?:internet explorer/5.0$|url control)|ssigua)|ailto:craftbot@yahoo.com|urzillo compatible)|p(?:ro(?:gram shareware 1.0.|duction bot|webwalker)|a(?:nscient.com|ckrat)|oe-component-client|s(?:ycheclone|urf)|leasecrawl/1.|cbrowser|e 1.4|mafind)|e(?:mail(?:(?:collec|harves|magne)t|(?: extracto|reape)r|(siphon|spider)|siphon|wolf)|(?:collecto|irgrabbe)r|ducate search vxb|xtractorpro|o browse)|t(?:(?: ?h ?a ?t ?' ?s g ?o ?t ?t ?a ? h ?u ?r ?|his is an exploi|akeou)t|oata dragostea mea pentru diavola|ele(?:port pro|soft)|uring machine)|a(?:t(?:(?:omic_email_hunt|spid)er|tache|hens)|d(?:vanced email extractor|sarobot)|gdm79@mail.ru|miga-aweb/3.4|utoemailspider| href=)|^(?:(google|i?explorer?.exe|(ms)?ie( [0-9.] )? ?(compatible( browser)?)?)$|www.weblogs.com|(?:jakart|vi)a|microsoft url|user-Agent)|s(?:e(?:archbot admin@google.com|curity scan)|(?:tress tes|urveybo)t|.t.a.l.k.e.r.|afexplorer tl|itesnagger|hai)|n(?:o(?:kia-waptoolkit.* googlebot.*googlebot| browser)|e(?:(?:wt activeX; win3|uralbot/0.)2|ssus)|ameofagent|ikto)|f(?:a(?:(?:ntombrows|stlwspid)er|xobot)|(?:ranklin locato|iddle)r|ull web bot|loodgate|oobar/)|i(?:n(?:ternet(?: (?:exploiter sux|ninja)|-exprorer)|dy library)|sc systems irc search 2.1)|g(?:ameBoy, powered by nintendo|rub(?: crawler|-client)|ecko/25)|(myie2|libwen-us|murzillo compatible|webaltbot|wisenutbot)|b(?:wh3_user_agent|utch__2.1.1|lack hole|ackdoor)|d(?:ig(?:imarc webreader|out4uagent)|ts agent)|(?:(script|sql) inject|$botname/$botvers)ion|(msie . ; .*windows xp|compatible ; msie)|h(?:l_ftien_spider|hjhj@yahoo|anzoweb)|(?:8484 boston projec|xmlrpc exploi)t|u(?:nder the rainbow 2.|ser-agent:)|(sogou develop spider|sohu agent)|(?:(?:d|e)browse|demo bot)|zeus(?: .*webster pro)?|[a-z]surf[0-9][0-9]|v(?:adixbot|oideye)|larbin@unspecified|bdatacha0sb|kenjin spider|; widows|rsync|\r))'
И есть много других, откуда они пришли…..
Точка, как вы могли заметить, в первом случае "
экранируется только с "
помощью bot, а не '
Следовательно,
rex_pcre.new('['";=]')
Не будет работать.
rex_pcre.new("['";=]")
Однако должны работать части в регулярном выражении, такие как -
.
Я также не могу использовать
[[ ]]
поскольку есть регулярное выражение, которое заканчивается ]
(первый пример)
разрыв строк, как в
rex_pcre.new( [[
['";=]
]])
не будет работать для меня в таких случаях, как третий, который заканчивается, )
а также вызвал ошибку неожиданного символа.
в общем, я ищу такую для r"UNESCAPED STRING"
Python или @"UNESCAPED STRING"
C #..
Я предполагаю, что такого нет, но интересно, как получить аналогичную функциональность, учитывая тот факт, что я использую только это значение (регулярное выражение) и не контролирую, как их составить изначально..
Вот мое текущее решение, я просто пытаюсь скомпилировать строку, в [[ ]]
случае неудачи переместиться в "
, а затем в «‘»/
EscapeRegEx = function (xp)
-- try with [[ ]]
local opening = '[['
local closing = ']]'
local codeline = "rex_pcre.new(" .. opening .. xp .. closing .. ")"
_, err = loadstring(codeline)
if not err then return codeline end
-- then try with "
opening = '"'
closing = '"'
codeline = "rex_pcre.new(" .. opening .. xp .. closing .. ")"
_, err = loadstring(codeline)
if not err then return codeline end
-- then try with '
opening = "'"
closing = "'"
codeline = "rex_pcre.new(" .. opening .. xp .. closing .. ")"
_, err = loadstring(codeline)
if not err then return codeline end
end
Ответ №1:
Вы можете использовать более длинные версии длинных скобок:
[=========[the regex goes in here]=========]
Открывающей длинной скобке будет соответствовать только закрывающая длинная скобка той же длины.
Смотрите Это для получения более подробной информации; вы также можете сделать аналогичную вещь, чтобы получить вложенные многострочные комментарии.
Комментарии:
1. Выполнил ЗАДАНИЕ! Не знал об этом [===[ игра.