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

Допустим, у меня есть строка "бла-бла F12-бла-бла F32-бла-бла-бла", и я хочу сопоставить F12 и F32, как бы мне было захватить обе переменные магической переменной Powershell $ match?

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

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

Переменная $ соответствует только F12

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

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

На этот раз у $ match было два предмета, но оба F12

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

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

4 ответа

Решение

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

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

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

Msgstr "Это исправлено параметром -allmatches для строки выбора."

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

$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

Я вижу 2 сценария, которые обрабатываются по-разному:

  1. извлечение всех совпадений одного шаблона
  2. извлечение одного совпадения из нескольких шаблонов

1. извлечь все совпадения одного шаблона: select-string + -allmatches

  • например, регулярное выражение: (?<=jobs).*
  • нелогично, но вам нужно использовать Select-String чтобы справиться с этим, как я, чтобы получить идентификаторы рабочих мест кочевников из выходных данных, приведенных ниже
      $m = "Watch the deployment in realtime at: https://nomad.foo.net/ui/jobs/20e183af-8243-11eb-a2af-0a58a9feac2a
08:23
Watch the deployment in realtime at: https://nomad.foo.net/ui/jobs/20e130e9-8243-11eb-a2af-0a58a9feac2a"
$r = "(?<=jobs/).*"
$l = Select-String $r -InputObject $m -AllMatches | 
    Foreach {$_.matches.Value}
20e183af-8243-11eb-a2af-0a58a9feac2a
20e130e9-8243-11eb-a2af-0a58a9feac2a
$l[0]
>>> 20e183af-8243-11eb-a2af-0a58a9feac2a

2. извлечь одно / первое совпадение одного / нескольких шаблонов: группы захвата и $ Match []

      ▶ $s = "Hello World from Mr Pavol"
▶ $r = "(World).*(Pavol)"
▶ $s -match $r
True
▶ $Matches
Name                           Value
----                           -----
2                              Pavol
1                              World
0                              World from Mr Pavol
$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
Другие вопросы по тегам