无效的转义序列lua regex

时间:2018-12-11 17:50:29

标签: regex nginx lua pcre

我编写了一个正则表达式以匹配下面的字符串类型,当我在正则表达式匹配器中在线检查它时,它可以按预期工作-

"['432', '212']"

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

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

当我在lua块内部使用此字符串来匹配字符串时,这给了我无效的转义序列错误。 我对双引号进行了转义,并尝试使用\来转义正则表达式中的特殊字符,但问题仍然存在。任何指针都会有所帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

就个人而言,我更喜欢为最简单的模式编写一个解析器。它比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

答案 1 :(得分:0)

我将重申人们在评论中所说的话。您已在正则表达式中使用\[,它是带引号的字符串。在带引号的字符串中,反斜杠开始一个转义序列,但是\[是无效的转义序列(有关有效的转义序列,请参见the Lua 5.1 manual),因此Lua解析器对此有所抱怨。 Vanilla Lua 5.1只是删除了反斜杠(这在此正则表达式中是不好的),而Lua 5.3和LuaJIT对此表示抱怨。

您可以删除解析错误,并通过使用另一个反斜杠"\\["来转义反斜杠来确保将反斜杠实际上插入到了字符串中,就像使用RegExp constructor时在JavaScript中所做的那样,或使用不解释转义序列的长字符串– [[\[]]。如果使用长字符串,则还必须将正则表达式中的转义双引号\"替换为纯"