我正在开发一个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|")
有人可以帮助我知道这可能是什么原因吗?
答案 0 :(得分:1)
你的第一个问题是因为字符串中的序列\.
正在转义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
匹配
下一个。模式中的最后一个管道char允许匹配空字符串。
所以几乎每个字符串都符合这种模式。
此外,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