在PowerShell中协助使用可选的Regex

Tch*_*hke 2 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 .*\]))
Run Code Online (Sandbox Code Playgroud)

这有效,除非它只是软件的名称.各种摆放?标记正则表达式的OR部分没有奏效.我需要做些什么更改才能捕获第1项和第3项以及其他所有内容?

Ans*_*ers 5

我会使用这样的表达式:

(.+?)(?:  \[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)