我正在尝试解析软件,版本号,并根据以下数据安装日期:
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 .*\]))
除非它只是软件的名称,否则它的工作原理。各种摆放?标记正则表达式的OR部分没有奏效。我需要做些什么更改来捕获第1项和第3项以及其他所有内容?
答案 0 :(得分:5)
我会使用这样的表达式:
(.+?)(?: \[version (.+?)\])?(?: \[installed on (.+?)\])?$
这使用非捕获组来匹配可选部分,并使用非贪婪匹配捕获组,以便提取相关信息。
(.+?)
:捕获组以提取软件名称。(?: \[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
}
}
答案 1 :(得分:2)
在regex101.com我成功尝试了:
([^\[]*?) *((\[version .*\]) (\[installed on .*\])|(\[version .*\])|(\[installed on .*\]))
我建议使用命名捕获组,否则编号可能很奇怪。