【问题标题】:Invalid escape sequence lua regex无效的转义序列lua正则表达式
【发布时间】:2019-05-12 18:31:13
【问题描述】:

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

"['432', '212']"

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

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

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

【问题讨论】:

  • 你试过local regex = [["(\[)('([^']|'')*'), ('([^']|'')*')(])"]]吗?
  • 我不知道 lua,但是在很多语言中,\ 在字符串文字中是特殊的,所以你实际上必须使用\\[\[ 传递给正则表达式引擎以匹配文字[.
  • @ikegami - 是的,你说得对,它是 PCRE。我的错。

标签: regex nginx lua pcre


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我个人更喜欢为最简单的模式编写解析器。它比正则表达式灵活得多,即使它变大也能保持可读性。下面我展示了一个解析器,用于使用 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
    

    【讨论】:

    • 我很好奇,你为什么将 require 包装在 assert 中?
    • @dualed 我知道lpeg 应该返回一个表。如果它返回nil,那么我知道加载了错误的模块。如果您有一个包含许多文件的项目并且其中一个文件意外地与模块同名,这并不少见。或者,如果您处于嵌入场景中,应用程序可能会通过将某些库设置为 nil 来禁用它们(出于安全原因,嵌入 LuaJIT 的应用程序有时会禁用 ffi)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多