无效的转义序列lua正则表达式

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

"['432', '212']"

正则表达式 - "(\[)('([^']|'')*'), ('([^']|'')*')(])"

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

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

点赞
用户1944004
用户1944004

个人而言,即使是对于最简单的模式,我也更喜欢编写解析器。 它比正则表达式更灵活,并且即使它变得更大,它仍然可读。 下面我使用 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
2018-12-12 06:40:18
用户9383219
用户9383219

我将重申评论中人们所说的内容。您在正则表达式中使用了 [ ,这是一个被引用的字符串。在引用字符串中,反斜杠(\)开始一个转义序列,但 [ 是一个无效的转义序列(请参见 Lua 5.1 手册 了解有效的转义序列),因此 Lua 解析器会报错。 Vanilla Lua 5.1 只会删除反斜杠(这在这个正则表达式中会有问题),而 Lua 5.3 和 LuaJIT 会报错。

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

2018-12-12 07:29:18