Неверная последовательность escape lua regex - PullRequest
0 голосов
/ 11 декабря 2018

Я написал регулярное выражение, чтобы соответствовать приведенному ниже типу строки, который работает, как и ожидалось, когда я проверяю его онлайн в regex matcher-

"['432', '212']"

regex - "(\[)('([^']|'')*'), ('([^']|'')*')(])"

ngx.re.find(string, "\"(\[)('([^']|'')*'), ('([^']|'')*')(])\"", "jo")

Когда я использую это внутри блока lua, чтобы соответствоватьстрока дает мне неверную ошибку escape-последовательности.я избежал двойных кавычек и попытался избежать специального символа в регулярном выражении, а также \, но проблема остается.любой указатель поможет.Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Я повторю то, что люди сказали в комментариях.Вы использовали \[ в своем регулярном выражении, которое является строкой в ​​кавычках.В строке в кавычках обратная косая черта начинает escape-последовательность, но \[ - недопустимая escape-последовательность (действительные escape-последовательности см. В руководстве Lua 5.1 ), поэтому парсер Lua жалуется на это.Vanilla Lua 5.1 просто удаляет обратную косую черту (что было бы плохо в этом регулярном выражении), в то время как Lua 5.3 и LuaJIT жалуются на это.

Вы можете удалить ошибку синтаксического анализа и убедиться, что обратная косая черта фактически вставлена ​​в строкупутем экранирования с помощью другой обратной косой черты - "\\[" - как вы должны сделать в JavaScript при использовании конструктора RegExp , или с помощью длинной строки, которая не интерпретирует escape-последовательности - [[\[]].Если вы используете длинную строку, вы также должны заменить экранированные двойные кавычки \" в своем регулярном выражении просто на ".

0 голосов
/ 12 декабря 2018

Лично я предпочитаю писать парсер даже для самых простых шаблонов.Он гораздо более гибкий, чем Regex, и остается читаемым, даже когда он становится больше.Ниже я показываю парсер для выражения, которое вы хотите сопоставить, используя LPEG .

. Вы можете найти хороший учебник LPEG здесь: http://leafo.net/guides/parsing-expression-grammars.html

local lpeg = assert(require("lpeg"))
local C, Ct, P, R, S = lpeg.C, lpeg.Ct, lpeg.P, lpeg.R, lpeg.S

-- optional whitespace (zero or more)
local ws = S" \n\r\t"^0

-- quoted integer, converted to number
local quot = P"'" * C(R"09"^1) / tonumber * P"'"

-- integer followed by zero or more commas followed by integer
local list = quot * ws * (P"," * ws * quot)^0

-- [ followed by list of integers captured in a table followed by ]
local rule = P"[" * ws * Ct(list) * ws * P"]"

-- match the string and collect results
local nums = rule:match("['432', '212']")

-- print result table
print(table.concat(nums,","))
$ lua test.lua 
432,212
...