在PowerShell中协助使用可选的Regex

时间:2017-01-06 22:54:09

标签: regex powershell

我正在尝试解析软件,版本号,并根据以下数据安装日期:

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项以及其他所有内容?

2 个答案:

答案 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 .*\]))

我建议使用命名捕获组,否则编号可能很奇怪。