LUA模式匹配未按预期工作

我正在编写一个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|")

有人能帮助我了解这可能的原因吗?

点赞
用户2328287
用户2328287

你的第一个问题是因为字符串内的序列 \. 被转义了。 在 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]]")
-- 或者如果你需要管道作为字符串的最后一个字符
local reg = regex.new([[555d%|@7\.7\.7\.7\b\|]]")

意思是匹配 555d%@7.7.7.7

2017-09-21 07:15:37