我试图解析软件,版本号,并在日期安装从这样的数据:
AXIS Media Control Embedded AXIS Media Control 5.60 Redist [installed on 2014/05/28] Cisco WebEx Meetings Adobe Flash Player 13 ActiveX [version 13.0.0.214] Adobe Flash Player 13 Plugin [version 13.0.0.214] Bullzip PDF Printer 9.3.0.1516 [version 9.3.0.1516] [installed on 2014/05/12] Security Management System (Client) [version 7.0.1.0] [installed on 2014/05/28] Symmetry7500 Plugin [version 1.3] [installed on 2014/05/28] Cross Match Transmission Manager [version 3.8.9.0012] [installed on 2014/05/08] Cross Match Live Scan Management System [version 8.4.5.0031] [installed on 2014/05/08] System Center Endpoint Protection [version 4.7.214.0] [installed on 2016/07/21] Mozilla Firefox 50.0.2 (x86 en-US) [version 50.0.2] Mozilla Maintenance Service [version 50.0.2]
我正在使用的数据将始终以软件名称开头,然后可以同时具有版本号并在日期或其中一个或两个都安装.如果两者都存在虽然它始终是版本号,然后在日期安装.
这是我到目前为止的正则表达式:
(.*?) ((\[version .*\]) (\[installed on .*\])|(\[version .*\])|(\[installed on .*\]))
Run Code Online (Sandbox Code Playgroud)
这有效,除非它只是软件的名称.各种摆放?标记正则表达式的OR部分没有奏效.我需要做些什么更改才能捕获第1项和第3项以及其他所有内容?
我会使用这样的表达式:
(.+?)(?: \[version (.+?)\])?(?: \[installed on (.+?)\])?$
Run Code Online (Sandbox Code Playgroud)
这使用非捕获组来匹配可选部分,并使用非贪婪匹配捕获组以允许提取相关信息.
(.+?)
:捕获组以提取软件名称.(?: \[version (.+?)\])?
:可选的非捕获组,用于将版本信息(如果存在)与嵌套捕获组进行匹配,以提取版本号.(?: \[installed on (.+?)\])?
:可选的非捕获组,用于将安装日期信息(如果存在)与嵌套捕获组进行匹配,以提取日期.$
:将表达式锚定在字符串的末尾.例:
$file = 'C:\path\to\software.txt'
$pattern = '(.+?)(?: \[version (.+?)\])?(?: \[installed on (.+?)\])?$'
Get-Content $file | Select-String $pattern | ForEach-Object {
New-Object -Type PSObject -Property @{
Name = $_.Matches.Groups[1].Value
Version = $_.Matches.Groups[2].Value
InstalledOn = $_.Matches.Groups[3].Value
}
}
Run Code Online (Sandbox Code Playgroud)