Powershell 正则表达式 - 如何避免注释块

Powershell regex- how to avoid commented blocks

我有几个正则表达式块可以解析 C++ 文件以获取特定信息。我正在尝试更改我的正则表达式,以便它避免注释块。仍然捕获注释块的代码是:

Function Get-CaseContents{
  [cmdletbinding()]
  Param ( [string]$parsedCaseMethod, [string]$basePathFull)
  Process
  {
      # split into separate "case" blocks.
      # (the funky "(?=...)" preserves the delimiter)
      $blocks = $parsedCaseMethod -split "(?=case (.*):)";

      $pattern = `
      "_stprintf[\s\S]*?_T\D*" +
      "(?<sdkErr>[x\d]+)" +
      "\D[\s\S]*?" +
      "\((?<sdkDesc>(.+?)`")\)" +
      "[\s\S]*?" +
      "(outError\s*=\s*(?<sdkOutErr>[a-zA-Z_0-9]*))" +
      "[\s\S]*?" +
      "(?<sdkSeverity>outSeverity\s*=\s[a-zA-Z_]*)";

      # note - skip first block as it's the preamble before the first "if"
      $result = $blocks `
      | select-object -skip 1 `
      | select-string -pattern $pattern `
      | foreach-object {
          $match = $_.Matches[0];
          $tmp_removeParen = $match.Groups['sdkDesc'] -replace '\(|\)|%s|\"',"."
          [PSCustomObject] [ordered] @{
              "sdkErr"      = $($match.Groups['sdkErr'])
              "sdkDesc"     = $($tmp_removeParen)
              "sdkOutErr"   = $($match.Groups['sdkOutErr'])
              "sdkSeverity" = ($match.Groups['sdkSeverity'] -split '_')[-1]
          }
      };
      return $result 



     
  }#End of Process
}#End of Function 

这得到了所有目标内容加上我想避免的注释块。正在解析的 C++ 代码如下所示:

        case kRESULT_STATUS_SHORTAGE:  
            _stprintf(outDevStr, _T("2000 - (Shortage issue) - %s(Shortage)"), errorStr);
            outError = HOP_SHORTAGE;
            outSeverity = CCC_INFORMATION;
            break;


// New Error codes(really old errors broken out with unique error codes) - not all have this line
        //case kRESULT_STATUS_User_CoverOpenErr:    //comment here  
        //  _stprintf( outDevStr, _T("2900 - (Cover Open) - %s(Upper cover open.)"), errorStr);
        //  outError    = HOP_COVER_OPEN;
        //  outSeverity = CCC_INFORMATION;
        //  break;

我尝试将带有拆分的第一部分更改为此,但它 return 没有结果。我觉得如果我只是弄清楚如何不包含在 case 行上注释的 case 块,它将解决所有问题。

$blocks = $parsedCaseMethod -split "(?=^[\s]+case (.*):)"; #didn't work - nothing in $result

如有任何帮助,我们将不胜感激。谢谢! :)

这是 Powershell 5.1 和 VS Code。

最简单的方法可能是在拆分之前在第一步中消除所有注释行:

$blocks = $parsedCaseMethod -replace '(?m)^\s*//.*' -split '(?=case (.*):)'

注:

  • 为了保持正则表达式简单,上面的代码有效地用 空行 替换了注释行(但是,它确实删除了空行和 all-whitespace注释行 之前 行)。如果你想避免这种情况,请使用 -replace '(?m)^\s*//.*(?:\r?\n)?'

  • 假设您的 C++ 代码不包含 multi-line 注释 (/* ... */),并且没有 //-C++ 11 中的前缀行 raw string literals.