.net 正则表达式多行日志

.net 正则表达式多行日志,.net,regex,powershell,.net,Regex,Powershell,我想使用.NET/Powershell正则表达式在日志中搜索特定位置的Success状态,例如ABC 如果我使用以下模式:”(?ms)A status:Success.*Location:“with global(又称AllMatches),那么它会在任何位置查找状态为Success的所有日志记录 如果我试图通过在模式中添加ABC来缩小范围,那么匹配太贪婪了,从第18行的成功一直到第28行的ABC 我放弃了,使用了一种更明确的模式(它获取完整的日志记录,并且似乎有效,因为我指定了成功和位置之间的

我想使用.NET/Powershell正则表达式在日志中搜索特定位置的
Success
状态,例如
ABC

如果我使用以下模式:
”(?ms)A status:Success.*Location:“
with global(又称AllMatches),那么它会在任何位置查找状态为
Success
的所有日志记录

如果我试图通过在模式中添加
ABC
来缩小范围,那么匹配太贪婪了,从第18行的成功一直到第28行的
ABC

我放弃了,使用了一种更明确的模式(它获取完整的日志记录,并且似乎有效,因为我指定了成功和位置之间的模式):

(?sm)^\d([\S]*\S{10}){3}状态:Success\S{2}([\S]*\S{10}){2}位置:ABC[\S]*

有没有更简单的模式可以找到我想要的

注意:我不介意模式是否获取从日期时间(包括)到日期时间(不包括)的完整日志记录

日志文件:

04/09/2018 06:31:59 AM [class | Info] some message received from 101592 (123.123.123.124)
        Request Id: 0 (Descriptor: 0, Operator Request Id: 0)
        A type: bar
        A status: Queued
        The id: 1E25
        Additional info: Inserted in queue at position 1 on device ABC
        Location: ABC, subarea: 2
04/09/2018 06:31:59 AM [class | Info] some message received from 102364 (123.123.123.123)
        Request Id: 0 (Descriptor: 0, Operator Request Id: 0)
        A type: bar
        A status: Queued
        The id: 1E25
        Additional info: Inserted in queue at position 1 on device ABC
        Location: ABC, subarea: 2
04/09/2018 06:31:59 AM [class | Info] some message received from 102364 (123.123.123.123)
        Request Id: 0 (Descriptor: 0, Operator Request Id: 0)
        A type: blah bit foo
        A status: Success
        The id: T908
        Additional info: 
        Location: DEF, subarea: 3
04/09/2018 06:32:00 AM [class | Info] some message received from 102364 (123.123.123.123)
        Request Id: 0 (Descriptor: 0, Operator Request Id: 0)
        A type: bar
        A status: Success
        The id: DG08
        Additional info: 
        Location: ABC, subarea: 1
尝试以下任何一种方法:

(?m)A状态:成功(?:\n\h++)+位置:ABC

(?m)状态:成功(?:\n\s++)+位置:ABC
(如果不支持
\h

解释

只需限制处理额外数据的方式。不要使用
*?
,只需使用
(?:\n\h+[^\n]+)+
(即新行+开头的一些空格)即可,因为日期从行的开头开始,因此不允许查看下一个日志条目

(注意:我删除了
s
修饰符)

尝试以下任何一种:

(?m)A状态:成功(?:\n\h++)+位置:ABC

(?m)状态:成功(?:\n\s++)+位置:ABC
(如果不支持
\h

解释

只需限制处理额外数据的方式。不要使用
*?
,只需使用
(?:\n\h+[^\n]+)+
(即新行+开头的一些空格)即可,因为日期从行的开头开始,因此不允许查看下一个日志条目


(注意:我删除了
s
修饰符)

尝试以下模式:
^\d{2}\/(.++\n){3}(?=.+Success)(.++\n){3}(?=.+ABC)。++

如果在行首有两个数字后跟
/
^\d{2}\/
,则开始匹配

然后,我匹配三行,进入
状态
行:
(.++\n){3}
,我使用所有格量词来避免回溯

然后,如果在当前行上出现
成功
,我将匹配接下来的三行(我使用正向前瞻检查):
(?=.Success)(.+\n){3}

然后我匹配最后一行,如果该行中有
ABC
(?=.+ABC)。++


尝试以下模式:
^\d{2}\/(.++\n){3}(?=.+Success)(.++\n){3}(?=.+ABC)。++

如果在行首有两个数字后跟
/
^\d{2}\/
,则开始匹配

然后,我匹配三行,进入
状态
行:
(.++\n){3}
,我使用所有格量词来避免回溯

然后,如果在当前行上出现
成功
,我将匹配接下来的三行(我使用正向前瞻检查):
(?=.Success)(.+\n){3}

然后我匹配最后一行,如果该行中有
ABC
(?=.+ABC)。++


这里的方法相当麻烦。使用
Get Content-Raw
读取文件,在
(?m)^(?=\d{2}/\d{2}/\d{4})处分成块
并反复使用
Where Object
Select String
来筛选所需的块。这里的方法相当麻烦。使用
获取内容-Raw
读取文件,在
处分为块(?m)^(?=\d{2}/\d{2}/\d{4})
并反复使用
Where Object
Select String
来筛选所需的块。只有当所需的日志条目是最后一个条目时,正则表达式才有效。@SebastianProske完全正确。现在应该修好了。谢谢我认为.NET不支持\h(水平空白)转义字符,但在其他方面也可以。它可以通过
\s
更改,我刚才使用
\h
是为了更安全。我将修改答案。您的正则表达式仅在所需的日志条目是最后一个条目时有效。@SebastianProske完全正确。现在应该修好了。谢谢我认为.NET不支持\h(水平空白)转义字符,但在其他方面也可以。它可以通过
\s
更改,我刚才使用
\h
是为了更安全。我将修改答案。