Lua中类似于正则表达式组的东西?

我有一个带有这样一行日志:

Jun 21 06:25:07 172.25.1.1 kernel: DROP IN=ppp0 OUT= MAC= SRC=206.221.177.2 DST=185.79.95.179 LEN=40 TOS=0x00 PREC=0x00 TTL=239 ID=25584 PROTO=TCP SPT=40001 DPT=58571 SEQ=1145952392 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0

我想从中提取一些信息:日期、来源IP等。 使用正则表达式我可以做到(在python或perl中):'^(... ..) .* DROP .* SRC=(\S+)' 但是在Lua中我该如何做呢?

点赞
用户3832970
用户3832970

你可以使用基于 string.match 的解决方案:

local s = "Jun 21 06:25:07 172.25.1.1 kernel: DROP IN=ppp0 OUT= MAC= SRC=206.221.177.2 DST=185.79.95.179 LEN=40 TOS=0x00 PREC=0x00 TTL=239 ID=25584 PROTO=TCP SPT=40001 DPT=58571 SEQ=1145952392 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 ]"
date,ip = string.match(s, "^(%w+ %d+ %d%d:%d%d:%d%d) .* DROP .* SRC=(%S+)")
print (date) -- Jun 21 06:25:07
print (ip)   -- 206.221.177.2

请参见在线 Lua 演示

模式说明

  • ^ - 字符串的开头
  • (%w+ %d+ %d%d:%d%d:%d%d) - 捕获组 #1(请注意其值将分配给 date,即左侧第一个变量):1个或多个字母数字、空格、1个或多个数字、空格、2个数字、冒号、2个数字、冒号和2个数字
  • .* DROP .* SRC= - 字符串文字
  • (%S+) - 捕获组 #2(请注意其值将分配给 ip,即左侧第二个变量):1个或多个非空白字符。

请记住,在 Lua 模式中有捕获组时,string.match 函数将返回所有捕获组。这非常方便。

2020-06-25 16:55:34