Powershell多线正则表达式

时间:2015-11-30 11:53:29

标签: regex powershell powershell-v2.0

我正试图通过以下示例获取完整错误:

date time somemethod EXC somenumber sometext  R:System.NullReferenceException: Object reference not set to an instance of an object.
   at sometext in somepath .cs:line somenumber System.NullReferenceException: Object reference not set to an instance of an object.
   at sometext in Somepath .cs:line somenumber 

从那以后,我想在EXC之后获取所有内容cs:line somenumber

01/01/01 date (mode) (status) (somenumber) (name+error),就在这里,通常会有一个新行继续出现错误消息,该消息以字符cs:line(number)结束。

我设法收到错误消息,因为它始终以EXC开头(所以正则表达式是EXC .*,但我无法通过代码获取完整的消息。我只能访问PowerShell 2.0,我使用以下公式:

$Filecontent = [io.file]::Readalltext("path to file")
$filecontent | select-string 'EXC .*' -allmatches |
  foreach {$_.Matches} | Foreach {$_.Value} > errors.txt

我需要的是获取行号的完整错误,但我有正确的正则表达式的问题。我不关心日期,时间,模式,正则表达式应该获得EXC状态并使用行获取完整的消息。

在使用正则表达式'EXC。* \ n。* cs:line [0-9] {0,99}后,它找到了那些在一行完成错误消息之后的消息,但是,有时会有更多下一行我也想拍摄。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果将错误(堆栈跟踪)定义为

  • 以第1列
  • 中的非空格字符开头
  • 跨越多行
  • 属于错误的每个附加行都缩进3个空格

然后捕获这样一个块的正则表达式如下所示:

(?m)^\S.*(\s*^   \S.*)+

使用它检索完整的堆栈跟踪块之后,您可以使用以下内容在第二步中选择行号:

at (.*?) in (.*?):line (\d+)

表达式分解为:

(?m)         # inline flag: multiline mode
^            # start-of-line
\S           # a non-whitespace character
.*           # anything up to the end of the line
(            # group 1
  \s*        #   any number of whitespace (this matches newline character)
  ^          #   start-of-line
             #   3 spaces
  \S         #   a non-whitespace character
  .*         #   anything up to the end of the line
)+           # end of group 1, repeat at least once

比较:https://regex101.com/r/rW1hD6/1