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)?'
- 有关正则表达式的解释以及使用它进行试验的能力,请参阅 this regex101.com page。
假设您的 C++ 代码不包含 multi-line 注释 (/* ... */
),并且没有 //
-C++ 11 中的前缀行 raw string literals.
我有几个正则表达式块可以解析 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)?'
- 有关正则表达式的解释以及使用它进行试验的能力,请参阅 this regex101.com page。
假设您的 C++ 代码不包含 multi-line 注释 (
/* ... */
),并且没有//
-C++ 11 中的前缀行 raw string literals.