我用C来做我的正则表达式。除输入字符串包含选项卡外,其他工作都有效。
这是我的RegEx I插入regcomp功能:
(DROP).*(tcp).*([\\.0-9]+).*0\\.0\\.0\\.0.*dpt:([0-9]+)(.*)
Regcomp返回OK,没有任何问题。
然后我使用以下字符串进行匹配:
DROP\ttcp\t--\t202.153.39.52\t0.0.0.0/0\ttcp dpt:21
我使用这样的字符串来模拟iptables的输出,因为我想制作一个程序来查看已列出的IP。
当我执行程序时,我在执行RegEx后收到以下输出,其中第一行是第一个偏移量的数据:
DROP tcp -- 202.153.39.52 0.0.0.0/0 tcp dpt:21
DROP
tcp
2
21
除了倒数第二个值之外,一切都是正确的。它显示2,但我预计它是202.153.39.52。我在我的RegEx中使用([\\.0-9]+)
试图明确指出我只想要数字和点匹配。
如何修复我的RegEx?
更新
然后我继续使用这个RegEx,希望我得到IP地址的每个八位字节
(DROP).*(tcp).*([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.([0-9]+).*(0\\.0\\.0\\.0).*dpt:([0-9]+)
这是我的结果:
DROP tcp -- 202.153.39.52 0.0.0.0/0 tcp dpt:21
DROP
tcp
2
153
39
52
0.0.0.0
21
现在这意味着第一个([0-9]+)
没有正确处理。我应该收到202,而不是2.有什么我做错了吗?我是否需要任何RegEx功能的特殊标志?
答案 0 :(得分:1)
我认为你对正则表达式语法和编码为字符串的语法之间的区别感到困惑(在像Java这样没有一流正则表达式的语言中)。
尝试一些更强大和常识的东西:
DROP\s+tcp\s+\S+\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+0\.0\.0\.0/0\s+tcp\s+dpt:(\d+)
这将仅捕获IP地址和端口号。为什么要捕获像DROP
这样的固定字符串?
作为字符串,这是:
"DROP\\s+tcp\\s+\\S+\\s+(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})\\s+0\\.0\\.0\\.0/0\\s+tcp\\s+dpt:(\\d+)"
使用在线正则表达式测试器like this one进行测试,并自动从正则表达式转换为字符串。