Как захватить несколько совпадений регулярных выражений из одной строки в магическую переменную $matches в Powershell?

Скажем, у меня есть строка "blah blah F12 blah blah F32 blah blah blah" , и я хочу сопоставить F12 и F32, как бы я взял захват как волшебной переменной Powershell $спички?

Если я запустил следующий код в Powershell:

$string = "blah blah F12 blah blah F32 blah blah blah"
$string -match "F\d\d"

Переменная $matches содержит только F12

Я также пробовал:

$string -match "(F\d\d)"

На этот раз $matches состояло из двух элементов, но оба F12

Я хотел бы, чтобы $match содержал как F12, так и F32 для дальнейшей обработки. Я просто не могу найти способ сделать это.

Вся помощь будет принята с благодарностью.:)

Ответы

Ответ 1

Вы можете сделать это, используя Select-String в PowerShell 2.0, например:

Select-String F\d\d -input $string -AllMatches | Foreach {$_.matches}

В то время как у меня был запрос оператора -matchall на MS Connect, и это предложение было закрыто как исправлено с этим комментарием:

"Это фиксируется параметром -allmatches для select-string."

Ответ 2

Я предлагаю использовать этот синтаксис, чтобы упростить обработку массива совпадений:

$string = "blah blah F12 blah blah F32 blah blah blah" ;
$matches = ([regex]'F\d\d').Matches($string);
$matches[1].Value; # get matching value for second occurance, F32

Ответ 3

$String = @'
MemberProgram PackageID="12345678" ProgramName="Install"/
MemberProgram PackageID="87654321" ProgramName="Install"/
MemberProgram PackageID="21436587" ProgramName="Install"/
MemberProgram PackageID="78563412" ProgramName="Install"/
'@
([regex]'(?<=PackageID=\")\d+(?=\")').Matches($String).value