Radagast
Radagast

Reputation: 1096

extract a variable value from the middle of a string

I have been trying to figure out for quite sometime. how do I get the PID value from the following string using powershell? I thought REGEX was the way to go but I can't quite figure out the syntax. For what it is worth everything except for the PID will remain the same.

    $foo = <VALUE>I am just a string and the string is the thing. PID:25973. After this do that and blah blah.</VALUE>

I have tried the following in regex

[regex]::Matches($foo, 'PID:.*') | % {$_.Captures[0].Groups[1].value}
[regex]::Matches($foo, 'PID:*?>') | % {$_.Captures[0].Groups[1].value}
[regex]::Matches($foo, 'PID:*?>') | % {$_.Captures[0].Groups[1].value}
[regex]::Matches($foo, 'PID:*?>(.+).') | % {$_.Captures[0].Groups[1].value}

Upvotes: 1

Views: 947

Answers (2)

Shay Levy
Shay Levy

Reputation: 126912

Here's another option. Basically it replaces everything with the first capture group (which is the digits after 'pid:':

$foo -replace '^.+PID:(\d+).+$','$1'

Upvotes: 1

Nate Hekman
Nate Hekman

Reputation: 6657

For your regex you'll want to indicate what's before and after the portion you're looking for. PID:.* will find everything from the PID to the end of the string.

And to use a capture group you'll want to have some ( and ) in your regex, which defines a group.

So try this on for size:

[regex]::Matches($foo,'PID:(\d+)') | % {$_.Captures[0].Groups[1].value}

I'm using a regex of PID:(\d+). The \d+ means "one or more digits". The parentheses around that (\d+) identifies it as a group I can access using Captures[0].Groups[1].

Upvotes: 3

Related Questions