【问题标题】:LUA pattern matching not working as intendedLUA 模式匹配未按预期工作
【发布时间】:2018-03-02 08:56:57
【问题描述】:

我正在编写一个 LUA 脚本,该脚本旨在阻止传入数据的任何部分中包含字符串“@7.7.7.7”的所有行。 为此,使用了以下正则表达式:

local reg = regex.new("555d%|@7\.7\.7\.7\\b\|abc.com")

虽然这确实阻止了@7.7.7.7,但它也阻止了@757.787.84.91 我研究了 Lua 编程语言,它表明 % (而不是 )是魔术字符的转义字符。 (点) 因此,在模式 "555d%|@7.7.7.7\b|" 中,\ 没有任何效果,并且 .被用来匹配任何字符。 然而奇怪的是,当我用 % 替换 \ 时,它并没有阻塞包含“@7.7.7.7”的行。 新模式如下:

local reg = regex.new("555d%|@7%.7%.7%.7\\b|")

谁能帮助我知道这可能是什么原因?

【问题讨论】:

  • 你用的是什么库?如果要使用 Lua 模式,@7.7.7.7 可以与 @7%.7%.7%.7%f[%D] 匹配。如果是Iceberg with Oniguruma regex,则需要"555d%\\|@7\\.7\\.7\\.7\\|"(如果|是文字符号)。
  • 感谢您的回复。实际上这些都是预先写好的脚本,这是我第一次接触 Lua。因此,尽管我认为它基于 PCRE,但我不确定正在使用哪个库。
  • 您真正的意见是什么?我的意思是,您需要 match 的确切文字字符串是什么?请注意,Lua 中的 [[...]] 就像 Python 中的原始字符串文字,\ 不被视为转义序列字符。 moteus的答案对你有用吗?那就接受吧。
  • 应该被阻止的输入:<12345678><12345678>

标签: lua pattern-matching lua-patterns


【解决方案1】:

您的第一个问题是因为字符串中的序列\. 正在转义字符。 在 Lua 5.1 上等于 . 但没有 Lua > 5.1 在 LuaJIT 上它会产生类似 invalid escape sequence near '\.' 的错误。 所以"555d%|@7\.7\.7\.7\\b|" 等于"555d%|@7.7.7.7\\b|"。 并且这个模式(假设它是 PCRE 兼容的)匹配到 @757.787 下一个。模式中的最后一个管道字符允许匹配空字符串。 所以几乎每个字符串都匹配这个模式。 PCRE 中的 d% 也等于 d%。 所以我认为你需要像

这样的模式
local reg = regex.new([[555d%|@7\.7\.7\.7\b]]")
-- or if you need pipe as last char in string
local reg = regex.new([[555d%|@7\.7\.7\.7\b\|]]")

这意味着匹配到555d%@7.7.7.7

【讨论】:

  • 感谢您的回答。最后一根管子插入不正确。但是我在这里有点困惑。你的意思是当放在字符串 '\' 内时不会有任何效果,但在括号内它将作为转义字符工作。我看到的唯一变化是用括号替换引号。
  • 你可以避开` chars as "555d%|@7\\.7\\.7\\.7\\b"`
  • 我对一件事感到好奇。虽然 "555d%|@7\\.7\\.7\\.7\\b" 工作得很好,但为什么 "555d%|@7%.7%.7%.7\\b" 不能当 Lua 编程手册说“字符 '%' 作为那些魔术字符的转义符时工作。所以,'%。'匹配一个点”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2021-08-14
  • 2023-02-22
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多