Maybe my reasoning is faulty, but I can't get this working.
Here's my regex: (Device\s#\d(\n.*)*?(?=\n\s*Device\s#|\Z))
Try it: http://regex101.com/r/jQ6uC8/6
$getdevice
is the input string. I'm getting this string from the Stream/Output from a command line tool.
$dstate = $getdevice |
select-string -pattern '(Device\s#\d(\n.*)*?(?=\n\s*SSD\s+|\Z))' -AllMatches |
% { $_ -match '(Device\s#\d(\n.*)*?(?=\n\s*SSD\s+|\Z))' > $null; $matches[0] }
Write-Host $dstate
Output:
Device #0 Device #1 Device #2 Device #3 Device #4
Same output for the $matches[1], $matches[2] is empty.
Is there a way I can get all matches, like on regex101.com? I'm trying to split the Output/String into separate variables (one for Device0, one for Device1, Device2, and so on).
Update: Here's the Output from the command line tool: http://pastebin.com/BaywGtFE
While it doesn't exactly answer your question, I'll offer a slightly different approach:
Just for fun,
I used your sample data in a here-string for my testing. This should work although it can depend on where your sample data comes from.
Using powershell 3.0 I have the following
or if your PowerShell Verison supports it...
Which returns 4 objects with their device id's. I don't know if you wanted those or not but the regex can be modified with lookarounds if you don't need those. I updated the regex to account for device id with more that one digit as well in case that happens.
The modifiers that I used
Another regex pattern thats works in this way that is shorter
try this variant:
With your existing regex, to get a list of all matches in a string, use one of these options:
Option 1
Option 2