Как записать несколько совпадений регулярных выражений из одной строки в магическую переменную $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. извлечь все совпадения одного шаблона: 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