How to capture multiple regex matches, from a single line, into the $matches magic variable in Powershell?
You can do this using Select-String in PowerShell 2.0 like so:
Select-String F\d\d -input $string -AllMatches | Foreach {$_.matches}
A while back I had asked for a -matchall
operator on MS Connect and this suggestion was closed as fixed with this comment:
"This is fixed with -allmatches parameter for select-string."
I suggest using this syntax as makes it easier to handle your array of matches:
$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
I see 2 scenarios that are handled differently:
- extracting all matches of a single pattern
- extracting single match of multiple patterns
1. extract all matches of one pattern: select-string + -allmatches
- e.g. regex:
(?<=jobs).*
- counter-intuitive but you need to use
Select-String
to handle this like I am to get ids of nomad jobs from the output exemplified below
$m = "Watch the deployment in realtime at: https://nomad.foo.net/ui/jobs/20e183af-8243-11eb-a2af-0a58a9feac2a08:23Watch 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-0a58a9feac2a20e130e9-8243-11eb-a2af-0a58a9feac2a$l[0]>>> 20e183af-8243-11eb-a2af-0a58a9feac2a
2. extract a single/first match of one/multiple patterns: capture groups and $Match[]
▶ $s = "Hello World from Mr Pavol"▶ $r = "(World).*(Pavol)"▶ $s -match $rTrue▶ $MatchesName Value---- -----2 Pavol1 World0 World from Mr Pavol