LUA模式匹配无法正常工作

LUA pattern matching not working as intended

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

1
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"的行。
新模式如下:

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

有人可以帮助我知道这可能是什么原因吗?


您的第一个问题,因为字符串中的序列\\.在转义char。
在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%
所以我认为你需要像

这样的模式

1
2
3
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

匹配