需要一个正则表达式来查找单词“ERROR:”,但不匹配“ERROR:打开本地文件”

需要一个正则表达式来查找单词“ERROR:”,但不匹配“ERROR:打开本地文件”

我正在用 PowerShell 编写一个错误检查脚本,用于查看 Bitvise SFTP 日志并在出现任何错误时发出警报。但是,我不希望它在出现字符串“ERROR: Opening Local File”时发出警报,因为这只是告诉我目标中已经存在该文件,这是预料之中的。我不太擅长使用正则表达式,似乎找不到正确的元素组合来查找除我们可以忽略的错误之外的错误。

例子:

ERROR: Writing local file  (I want to be alerted to this)
ERROR: Opening local file  (I don't want to be alerted to this)

答案1

这似乎做了你想要的 - 它使用了 PoSh 将正则表达式匹配应用于整个集合的方式。[咧嘴笑]

它能做什么 ...

  • 当准备真正执行此操作时,创建一个示例数据集,用调用
    替换整个块。#region/#endregionGet-Content
  • 设置想要的模式
  • 设置不需要的图案
  • 使用链式正则表达式调用来排除不想要的,然后包括通缉犯
  • 将其分配给$Result集合
  • 屏幕上显示

代码 ...

#region >>> fake reading in a text file
#    in real life, use Get-Content
$InStuff = @'
ERROR: Writing local file  (I want to be alerted to this)
ERROR: Opening local file  (I do not want to be alerted to this)
INFO: Some other thing
ERROR: Yet another thing
INFO: A thing that is wanted
WARNING: Something that may be wanted
'@ -split [System.Environment]::NewLine
#endregion >>> fake reading in a text file

$TargetPattern = 'error:'
$NotWantedPattern = ': opening local file'

$Result = $InStuff -notmatch $NotWantedPattern -match $TargetPattern

$Result

输出 ...

ERROR: Writing local file  (I want to be alerted to this)
ERROR: Yet another thing

答案2

正如 @spikey_richie 所说,你需要负面前瞻

ERROR: (?!Opening local file)

基本上,你不需要指定你正在寻找什么,而是指定你想要,并将其包裹在(?!里面)

演示

答案3

类似的东西也应该有效:演示

$MyString = @'
ERROR: Writing local file  (I want to be alerted to this)
ERROR: Opening local file  (I don't want to be alerted to this)
INFO: Some other thing
ERROR: Yet another thing
INFO: A thing that is wanted
WARNING: NOT a not-wanted thing
'@ -split [System.Environment]::NewLine

$pattern = 'ERROR: (?!Opening local file).+'
$MyString | %{ [regex]::matches($_,$pattern) } | %{ $_.Groups[0].Value }

答案4

这种情况与史上最伟大的正则表达式技巧--- 对于任何学习正则表达式的人来说都是一篇很好的读物。而负向前瞻由格洛芬德尔在这种情况下效果很好,这种技术很容易扩展到多个排除、后向查找与前向查找相结合等,并且仍然保持可读性。这个技巧的本质是捕获整体匹配中的所有排除和第 1 组中的所需内容。对于 OP,正则表达式将如下所示:

'ERROR: Opening local file|(ERROR:.+$)'

示例:(
在工作代码中,<Here-string> -Split "`n"
将被替换为
Get-Contnet 'c:\Path\To\Error.log' :)

@'
ERROR: Another error
ERROR: Writing local file  (I want to be alerted to this)
ERROR: Opening local file  (I don't want to be alerted to this)
THIS is not an error
'@ -Split "`n" | ForEach {
    $_ -match 'ERROR: Opening local file|(ERROR:.+$)' | out-null
    $matches[1]
}

屏幕截图:

PS C:\> @'
>> ERROR: Another error
>> ERROR: Writing local file  (I want to be alerted to this)
>> ERROR: Opening local file  (I don't want to be alerted to this)
>> THIS is not an error
>> '@ -Split "`n" | ForEach {
>>     $_ -match 'ERROR: Opening local file|(ERROR:.+$)' | out-null
>>     $matches[1]
>> }
ERROR: Another error
ERROR: Writing local file  (I want to be alerted to this)
PS C:\>

再次强调,这项技术的优点在于它很容易扩展: 'Exception1|Exception2|Exception3|(Desired Match)'

相关内容