Home > Back-end >  Powershell regex missing ones with CR etc
Powershell regex missing ones with CR etc

Time:04-06

I'm working on a regular expression to extract a map of key and associated string.

For some reason, it's working for lines that don't show a line split, but misses where there are line splits.

This is what I'm using:

  $errorMap = [ordered]@{}
  # process the lines one-by-one
  switch -Regex ($fileContent -split ';') {
    'InsertCodeInfo\(([\w]*), "(.*)"' { # key etc., followed by string like "Media size cassette missing"
      $key,$value = ($matches[1,2])|ForEach-Object Trim
      $errorMap[$key] = $value
    }
}

This is an example of $fileContent:

    InsertCodeInfo(pjlWarnCommunications, 
        "communications error");
    InsertCodeInfo(pjlNormalOnline, 
        "Online");
    InsertCodeInfo(pjlWarnOffline, 
        "offline");
    InsertCodeInfo(pjlNormalAccessing, "Accessing");  #this is first match :(
    InsertCodeInfo(pjlNormalArrive, "Normal arrive");
    InsertCodeInfo(pljNormalProcessing, "Processing");
    InsertCodeInfo(pjlNormalDataInBuffer, "Data in buffer");

It's returning the pairs from pjlNormalAccessing down, where it doesn't have a line split. I thought that using the semicolon to split the regex content would fix it, but it didn't help. I was formerly splitting regex content with

'\r?\n'

I thought maybe there was something going on with VSCode so I have exited and re-opened it, and re-running the script had the same result. Any idea how to get it to match every InsertCodeInfo through the semicolon line with the key-value pair?

This is using VSCode and Powershell 5.1.

Update:

Someone asked how $fileContent is created:

I call my method with the filenamepath ($FileHandler), and from/to strings/methodNames ($matchFound2 becomes $fileContent later as a method parameter):

$matchFound2 = Get-MethodContents -codePath $FileHandler -methodNameToReturn "OkStatusHandler::PopulateCodeInfo" -followingMethodName "OkStatusHandler::InsertCodeInfo"

Function Get-MethodContents{
  [cmdletbinding()]
  Param ( [string]$codePath, [string]$methodNameToReturn, [string]$followingMethodName)
  Process
  {
      $contents = ""
      Write-Host "In GetMethodContents method File:$codePath method:$methodNameToReturn followingMethod:$followingMethodName"  -ForegroundColor Green

      $contents = Get-Content $codePath -Raw #raw gives content as single string instead of a list of strings

      $null = $contents -match  "($methodNameToReturn[\s\S]*)$followingMethodName" #| Out-Null  

      return $Matches.Item(1) 
  }#End of Process
}#End of Function

CodePudding user response:

You can use

InsertCodeInfo\((\w ),\s*"([^"]*)

See the enter image description here

CodePudding user response:

This regular expression seems to be catching all lines, including ones with newline in the middle. Thanks for the suggestion @WiktorStribizew. I tweaked your suggestion, and it helped.

InsertCodeInfo\(([\w]*),[\s]*"([^"]*)

It might be the most succinct, but it's catching all lines. Feel free as always to post alternative suggestions. This is why I didn't accept my own answer.

  • Related