排除捕获组中包含字符串的行

时间:2018-11-01 02:41:32

标签: regex

包含以下内容的日志:

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

请告知。谢谢。

1 个答案:

答案 0 :(得分:1)

您可以创建一个与sysUpTime行匹配的可选(非捕获)组,以确保它不会包含在后续的varBind组中:

Variable\sBindings\s+(?:sysUpTime.+\s+)?(?P<varBind>[^;]+)
                     ^^^^^^^^^^^^^^^^^^^

https://regex101.com/r/n5zPcr/2

如果sysUpTime可以出现在Variable Bindings之后第一行以外的地方,则请注意,任何组(或完全匹配)都必须包含输入中的连续个字符-没有其他方法,例如捕获初始子字符串,匹配sysUpTime行,然后捕获后面的子字符串,就不可能实现其中的一部分。