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|") |
有人可以帮助我知道这可能是什么原因吗?
- 您正在使用哪个库?如果要使用Lua模式,可以将@7.7.7.7与@7%.7%.7%.7%f[%D]匹配。如果它是带有Oniguruma正则表达式的Iceberg,则需要"555d%\\\\|@7\\\\.7\\\\.7\\\\.7\\\\|"(如果|是文字符号)。
-
感谢回复。实际上,这些是预先编写的脚本,这是我第一次与Lua交流。因此我不确定使用哪个库,尽管我认为它是基于PCRE的。
-
您真正的投入是什么?我的意思是,您需要匹配的确切文字字符串是什么?请注意,Lua中的[[...]]类似于Python中的原始字符串文字,\\不会被视为转义序列char。 moteus的答案对您有用吗?然后接受它。
-
不应被阻止的输入:<user:[email protected]>不应被阻止的输入:<user:[email protected]>
-
然后,您需要"@7(?:\\\\.7){3}\\\\b"。
-
感谢Wiktor对此进行调查。 Moteus的答案对我的影响很小。已经接受了答案。
您的第一个问题,因为字符串中的序列\\.在转义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
匹配
- 感谢您的回答。最后一个管道未正确插入。但是我在这里有点困惑。您的意思是说,当放在字符串'\\\\'内时没有任何作用,但是放在方括号内时它将作为转义符。我看到的唯一变化是用括号替换了引号。
-
您可以escepe ` chars as " 555d%| @ 7 \\\\\\\\。7 \\\\\\\\。7 \\\\\\\\。7 \\\\\\\\ b"
-
我对一件事感到好奇。虽然" 555d%| @ 7 \\\\\\\\。7 \\\\\\\\。7 \\\\\\\\。7 \\\\\\\\ b"可以正常工作,但为什么" 555d%|@7%.7%.7%当Lua编程手册说"字符'%'充当那些魔术字符的转义符。因此,'%'时,.7 \\\\\\\\ b"不起作用。匹配一个点"。