How to get a regex "group" from a select-string cmdlet

This topic contains 3 replies, has 2 voices, and was last updated by Profile photo of Curtis Smith Curtis Smith 12 months ago.

  • Author
  • #31300
    Profile photo of Old Cole
    Old Cole

    I am scraping a web request response to pull information held within the html code repeats a few times so using select string rather than match. My code looks like

    $regexname = '\(\w{0,11}).{1,10}\'
    $energenie.RawContent | select-string $regexname -AllMatches | % {$_.matches}

    The return looks something like:

    Groups : {(h2 class="ener")TV (/h2), TV}
    Success : True
    Captures : {(h2 class="ener")TV (/h2)}
    Index : 1822
    Length : 33
    Value : (h2 class="ener")TV (/h2)

    Groups : {(h2 class="ener")PS3 (/h2), PS3}
    Success : True
    Captures : {(h2 class="ener")PS3 (/h2)}
    Index : 1864
    Length : 33
    Value : (h2 class="ener")PS3 (/h2)

    N.B. I've changed the triangle brackets to circular brackets because of formatting on the forum

    I can't workout a way to grab the second element of groups e.g. TV or PS3 as:

    $energenie.RawContent | select-string $regexname -AllMatches | % {$_.matches.groups}

    Gives a strange output


  • #31302
    Profile photo of Curtis Smith
    Curtis Smith

    You will need to find out what position your group is in and then specify it like you would an array

    $energenie.RawContent | select-string $regexname -AllMatches | % {$_.matches.groups[0].value}
    $energenie.RawContent | select-string $regexname -AllMatches | % {$_.matches.groups[1].value}
    $energenie.RawContent | select-string $regexname -AllMatches | % {$_.matches.groups[2].value}
  • #31383
    Profile photo of Old Cole
    Old Cole


    Thanks for the feedback. I crossed post on to Stackoverflow and a response made me realise I was make a incorrect assumption. I had the impression that a piped ForEach-Object would iterate through the elements and I could grab the second item in the groups array, but it does appear it works like this, instead I created a variable to hold the match output and then stepped through every other group element using a For loop:

    $socketname = ($energenie.RawContent | select-string $regexname -AllMatches).matches
    For ($i = 1; $i -lt ($socketname.groups).count; $i+=2) {
    Write-Output "$(($socketname.groups[$i].Value).Trim())"

  • #31387
    Profile photo of Curtis Smith
    Curtis Smith

    @paul-bendall, that seems a little overkill for the result you are getting. If you are just wanting to get the value of all of the match groups you can do this.

    $energenie.RawContent | Select-String -Pattern $regexname -AllMatches | ForEach-Object {$_.matches.groups.value}

You must be logged in to reply to this topic.