我在使用正则表达式提取字符串的一部分时遇到问题,我无法看到我做错了什么。
字符串:
Backup job DailyBackupToNAS completed successfully. Destination: Network location Start time: 01/05/2013 05:00:28 End time: 01/05/2013 05:39:13 Duration: 00:38:45.5875346
代码:
$destinationregex = "Destination: (.*)Start time:"
If ($message -match $destinationregex)
{
$destination = $matches[1]
}
我正在尝试提取文本网络位置
任何指针都将不胜感激!
根据要求提供更全面的代码 $ events = get-eventlog application -source BackupAssist -newest 50
Foreach ($event in $events)
{
$message = $event.message
$destinationregex = "Destination: (.*)Start time:"
If ($message -match $destinationregex)
{
$destination = $matches[1]
}
Else
{
$destination = "Unknown"
}
Write.Host $destination
}
答案 0 :(得分:0)
好的,这次我发布了一个答案,更灵活的格式化,因为我相信这最终会解决问题。 ;)
试试这个:
$destinationregex = '(?s)Destination: ([^\r\n]*).*?Start time:'
(?s)
表示通配符可以匹配换行符。分组([^\r\n]*)
匹配到行尾,.*?
与换行符匹配。以下也适用:
$destinationregex = 'Destination: (.*?)\r\nStart time:'
事实上,既然你真的只想从“目的地:”之后匹配到行尾,你可以这样做,这是最简单的(除非你特别想确保你只匹配“开始时间:“是下一件事:”
$destinationregex = 'Destination: (.*)'
如果它仍然不起作用,可能是因为$ message被读取为数组而不是字符串。您可以在设置$ message后立即添加调试行$message.GetType()
来轻松测试。如果它是一个数组,请尝试以这种方式设置$ message(除了使用上面的一个正则表达式):
$message = $event.message | Out-String
事实上,这样做可以在任何一种情况下都有效,但如果| Out-String
已经是一个字符串,foreach ($event in $events)
{
$message = $event.message | Out-String
$destinationregex = 'Destination: (.*)'
If ($message -match $destinationregex)
{
$destination = $matches[1]
}
else
{
$destination = "Unknown"
}
Write-Host $destination
}
是多余的,尽管它没有受到伤害。
为清楚起见,这里是修改后的代码块,因为我认为它将最终结束,具体取决于上述问题的答案:
{{1}}