关于正则表达式

时间:2019-02-03 09:55:51

标签: regex powershell

我尝试获得$[个文本之间的信息。 我尝试使用以下正则表达式解决此问题:

$pattern = "(?=\$\[)(.*?)(?=\$\[)"

但是直到新行的开头。 例如

  

“在Fonet.Common.DicomNet.DicomAttributeCollection.Load(DicomDataSet ds)”

我该如何解决这个问题?

  

$ [WARN] 01.02.2019 09:14:14 ScheduledProcedureSequence找不到   $ [错误] 01.02.2019 11:09:02对象引用未设置为   对象的实例。 System.NullReferenceException对象引用   未设置为对象的实例。空洞   加载(Leadtools.Dicom.DicomDataSet)System.NullReferenceException:   你调用的对象是空的。在   Fonet.Common.DicomNet.DicomAttributeCollection.Load(DicomDataSet ds)
  在Fonet.Common.DicomNet.DicomAttributeCollection.Load(DicomDataSet   ds)$ [错误] 01.02.2019 11:09:02工作清单异常:对象   引用未设置为对象的实例。   System.NullReferenceException对象引用未设置为实例   一个对象。空载(Leadtools.Dicom.DicomDataSet)   System.NullReferenceException:对象引用未设置为实例   一个对象。在   Fonet.Common.DicomNet.DicomAttributeCollection.Load(DicomDataSet ds)

2 个答案:

答案 0 :(得分:1)

正则表达式中的点(.)运算符通常与除换行符以外的任何单个字符匹配。要同时匹配这些内容,您需要添加s标志,以使匹配器将输入视为单行。

您可以使用(?s)轻松完成此操作。这将为整个图案设置标志,因此,如果将其嵌入较大的图案中,请小心。

$pattern = "(?s)(?=\$\[)(.*?)(?=\$\[)"

此外,在两侧都使用前瞻((?= ))并使用零个或多个延迟重复(*?)的副作用是,它将始终匹配零个字符。您将要更改以下任何一项:

  • 使用后退标记:(?s)(?<=\$\[)(.*?)(?=\$\[)
  • 至少匹配一个字符:(?s)(?=\$\[)(.+?)(?=\$\[)
  • 将第一个前瞻模式更改为普通模式。 (?s)(\$\[.*?)(?=\$\[)

更多信息:

答案 1 :(得分:1)

我只是尝试过此方法,但无法按照我的要求进行。我已经发现一个不同的方式。

    $allErrors = New-Object System.Collections.ArrayList
    $str = "";
    foreach($log in $logs)
    {

        if($log -match "(?=\$\[)")
        {
            $allErrors.Add($object);
            $str = ""
            $str = $log        
            $object = New-Object psobject
            $object | Add-Member -MemberType NoteProperty -Name AlarmText -Value $str
            Write-Host $str -ForegroundColor Yellow
        }
        else
        {
            $str += $log
            $object.AlarmText = $str;
            Write-Host $str -ForegroundColor Red
        }
    }

当我遇到新错误时,我正在创建新对象。然后将行插入到对象中,直到遇到新的错误为止。我的问题通过这种方式解决了。谢谢您的帮助。

相关问题