如何在正则表达式中使组为 NULL

How to make a group NULL in regex

我想制作一个正则表达式,其中在一个日志中一组为 NULL

正则表达式

\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ)\s+(INFO|WARN|DEBUG|ERROR|FATAL|TRACE)\s+(.*?.*?\-\s+.*?)\s(\[?.*?\]?)\s+(.*)

日志

2019-11-14T04:25:00.123Z  WARN http-nio-127.0.0.1-7440-exec-127 CorfuCompileProxy - accessInner: Encountered a trim exception while accessing version 120383907 on attempt 0
2019-11-14T04:23:08.700Z  INFO RpcManagerRequestCleanupTimer RpcManager - SYSTEM [nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"] Rpc response not received for application FabricStats request com.vmware.nsx.management.agg.messaging.AggService$ClientDataRequestMsg from client 8ac94189-d611-4eb3-9b93-c3c3a8e3d36a with correlation id 287e690e-0a47-4459-a0bb-be36fe439068 in 432000000 msec.
2019-11-14T04:24:04.072Z  INFO MessagingObjectFactoryImpl-4-2 ExporterLastAckServiceImpl - - [nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"] Found exporter with elaId = Node#a3844284-e626-11e9-a87b-005056bcc0c6#AggSvc-L2-Bridging, returning lastAck = 16507 
2019-11-14T04:23:08.362Z  INFO ActivityEventRecovery-1 ActivityCacheManager - - [nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"] Handling activity 92d6a146-fa12-4889-a0ff-441087e047d0 completion event for 1 
2019-11-14T04:23:08.362Z  DEBUG ActivityEventRecovery-1 ActivityCacheManager - - [nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"] Handling activity 92d6a146-fa12-4889-a0ff-441087e047d0 completion event for 1

在上面的日志中,我希望第 4 组为 NULL,因为该日志不包含任何方括号。

我试了一段时间。这是 link - https://regex101.com/r/LJnVrS/93

请帮忙!

如果第 4 组必须存在并且内容必须以方括号开始或结束,您可以将组本身的内容设为可选。

要匹配以左侧的方括号开头或以右侧的方括号结尾,您可以使用 alternation:

((?:\S+\]|\[\S+)?)
  • ( 捕获 第 4 组
    • (?:非捕获组
      • \S+\] 匹配 1+ 个非空白字符和结尾 ]
      • |
      • \[\S+ 匹配起始 [ 和 1+ 个非空白字符
    • )?关闭群组并设为可选
  • )

模式可能看起来像

(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3}Z)\s+(INFO|WARN|DEBUG|ERROR|FATAL|TRACE)\s+((?:\S+\s+){4})((?:\S+\]|\[\S+)?)(.*)

Regex demo

如果所有行都从字符串的开头开始,您可以在模式前加上 ^ 并使用多行标志添加。

请注意,您必须转义点才能按字面意思匹配它。