包含以下内容的日志:
2018-10-31 14:14:39; dcv0000088; 192.168.48.200;
Variable Bindings
vmwVpxdNewStatus:= Green
vmwVpxdObjValue:= alarm.FanHealthAlarm - Event: Hardware Health Changed (3131155);
--ENDOFTRAP--
2018-10-31 10:41:49; sb02; 192.168.41.252;
Variable Bindings
sysUpTime:= 2 days 20 hours 18 minutes 24.23 seconds (24590423)
snmpTrapOID:= FSC-RTP-MIB:iandcAdmin.55.1.3.4.5 (1.3.6.1.4.1.4329.2.55.1.3.4.5)
iandcAdmin.55.1.1.3.0:= SIP Server not running
iandcAdmin.55.1.1.7.0:= SIP Server;
--ENDOFTRAP--
我想捕获Variable Bindings
之后和;
之前的所有文本,但从捕获中排除包含sysUpTime....
的行。
我使用正则表达式:
Variable\sBindings\s+(?P<varBind>[^;]+(?!sysUpTime\:=.*))
,但仍然无法正常工作。预期结果是:
varBind=
vmwVpxdNewStatus:= Green
vmwVpxdObjValue:= alarm.FanHealthAlarm - Event: Hardware Health Changed (3131155)
varBind=
snmpTrapOID:= FSC-RTP-MIB:iandcAdmin.55.1.3.4.5 (1.3.6.1.4.1.4329.2.55.1.3.4.5)
iandcAdmin.55.1.1.3.0:= SIP Server not running
iandcAdmin.55.1.1.7.0:= SIP Server
请告知。谢谢。
答案 0 :(得分:1)
您可以创建一个与sysUpTime
行匹配的可选(非捕获)组,以确保它不会包含在后续的varBind
组中:
Variable\sBindings\s+(?:sysUpTime.+\s+)?(?P<varBind>[^;]+)
^^^^^^^^^^^^^^^^^^^
https://regex101.com/r/n5zPcr/2
如果sysUpTime
可以出现在Variable Bindings
之后第一行以外的地方,则请注意,任何组(或完全匹配)都必须包含输入中的连续个字符-没有其他方法,例如捕获初始子字符串,匹配sysUpTime
行,然后捕获后面的子字符串,就不可能实现其中的一部分。