在正则表达式中跳过非捕获组

时间:2017-07-06 22:01:10

标签: regex

我写了一个正则表达式来捕获windows事件日志中的某些字段,下面是正则表达式:

(?:Subject\:)(?<Subject>.+)$[\n](?:Created)

以下是与Regex匹配的示例窗口事件日志。

Log: ABC
Source: DocumentService
Level: Error
Subject: 

ABC.BizService.DocumentVendors.DocumentVendorException: No Instances

Created On (UTC): 7/6/2017 8:57:04 PM
Created On (Local Machine): 7/6/2017 4:57:04 PM

System Information
Machine: Server1
Operating System: Microsoft Windows NT 6.2.9200.0
Process ID: 1360
Process Name: abc.Server.Document
System Name: PROD
Domain: Dom1
User: DOM1\66

Message ID: 0
Transaction Context: 0
Exception Id: 00000000-0000-0000-0000-000000000000
Submitted Message: 

Error building document '638. No Instances'

当我使用正则表达式的输出时,我得到以下输出:

ABC.BizService.DocumentVendors.DocumentVendorException: No Instances

Created On (UTC): 7/6/2017 8:57:04 PM

在最终输出中,我甚至想要排除此Created On字段以及之后的所有内容。如果您注意到我只想捕获Subject字段中正在写入的内容。看起来像我的正则表达式我甚至照顾非捕获组。但它们仍在出现。

1 个答案:

答案 0 :(得分:0)

由于.+是贪婪的,因此捕获组会将所有内容与第二个 Created行匹配,因此第一个Created行包含在匹配。

使用非贪婪量词.+?来获得最短匹配而不是最长匹配。

(?:Subject\:)(?<Subject>.+?)$[\n](?:Created)