LUA 模式匹配未按预期工作

LUA pattern matching not working as intended

我正在编写一个 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 上,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