我编写了一个正则表达式以匹配下面的字符串类型,当我在正则表达式匹配器中在线检查它时,它可以按预期工作-
"['432', '212']"
regex - "(\[)('([^']|'')*'), ('([^']|'')*')(])"
ngx.re.find(string, "\"(\[)('([^']|'')*'), ('([^']|'')*')(])\"", "jo")
当我在lua块内部使用此字符串来匹配字符串时,这给了我无效的转义序列错误。 我对双引号进行了转义,并尝试使用\来转义正则表达式中的特殊字符,但问题仍然存在。任何指针都会有所帮助。谢谢!
答案 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中所做的那样,或使用不解释转义序列的长字符串– [[\[]]
。如果使用长字符串,则还必须将正则表达式中的转义双引号\"
替换为纯"
。