我尝试获得$[
个文本之间的信息。
我尝试使用以下正则表达式解决此问题:
$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)
答案 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
}
}
当我遇到新错误时,我正在创建新对象。然后将行插入到对象中,直到遇到新的错误为止。我的问题通过这种方式解决了。谢谢您的帮助。