2017-01-06 2 views
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 .*\])) 

Это работает, за исключением, когда это только название программного обеспечения. Различное размещение? для отметки секции OR регулярного выражения не сработало. Какие изменения мне необходимо сделать, чтобы захватить пункты 1 и 3 вместе со всем остальным?

ответ

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 
    } 
} 
+0

Это сделал трюк! Спасибо много! – Tchotchke

2

На regex101.com я попытался успешно:

([^\[]*?) *((\[version .*\]) (\[installed on .*\])|(\[version .*\])|(\[installed on .*\])) 

Я предлагаю использовать именованные группы захвата, в противном случае нумерация может быть нечетным.