【发布时间】:2022-01-18 02:11:39
【问题描述】:
我正在尝试编写一个正则表达式来返回方法名称和以下方法名称之间的方法内容。我将进一步解析我正在提取的信息。我怎么做?到目前为止,我已经开始从方法名称中获取信息,但不知道如何让它停止在以下方法名称处。任何其他想法将不胜感激。
这将返回匹配字符串方法名称的行s(但我想要整个方法):
$contents = Get-Content $codePath | Select-String -Pattern "$methodNameToReturn.*" -AllMatches
这是我试图让它结束以下方法返回的字符串的地方,但它没有找到任何东西:
Get-MethodContents -codePath $File[0] -methodNameToReturn "GetStatusFromCode" -followingMethodName "SkipPage"
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
#Switch -regex (Get-Content -Path $codePath)
#{
#'^(.*)/s'{$contents=$switch.current}
#}
$contents = Get-Content $codePath | Select-String -Pattern "($methodNameToReturn.*$followingMethodName)" -AllMatches
Write-Host "File Contents Found: $contents" -ForegroundColor Cyan
}#End of Process
}#End of Function
这是尝试匹配的示例代码(重要的是我得到了 GetStatusFromCode 方法中的内容以进一步解析):
...
bool ClassName::GetStatusFromCode( DWORD errorCode,
TCHAR *errorStr,
DWORD &outError,
COM_ERROR_SEVERITY &outSeverity,
TCHAR *outDevStr)
{
m_bRestart = TRUE;
BYTE MinorCode = 0;
// Get and check width
DWORD dwLength = 0;
BYTE buff[ 2 ] = {0};
//
if ( chcusb_getInfo( (WORD)kPINFTAG_SVCINFO, buff, &dwLength ) == FALSE )
{
// Error
}
MinorCode = buff[1];
switch( errorCode )
{
//case kRESULT_NOERROR:
case kRESULT_MEMFULLERR:
//code
_sprintf(outDevStr, _T("8000 - (Comm Err)"), errStr);
outError = errVar;
break;
case kRESULT_USBNOTFOUND:
//code
_sprintf(outDevStr, _T("8001 - (Comm 1 Err)"), errStr);
outError = errVar;
break;
default:
// Maybe communication error
break;
}
m_dwErrorCode = outError;
if ( m_bRestart == TRUE )
{
return true;
}
else
{
return false;
}
}
////////////////////////////////////////
//
// METHOD NAME: SkipPage
//
////////////////////////////////////////
bool ClassName::SkipPage( GUID JobID, DWORD dwPageNum )
...
这是我寻找更多信息的地方:
match characters across multiple lines
我的问题是如何完全提取该方法名称的内容?我不在乎它是否包含以下MethodName,但它需要获取多行,直到感兴趣的方法的结束文本,methodNameToReturn。是的,我知道这样做很奇怪,但这就是我们所要求的。这是 PowerShell 5.1。
编辑:我退出了 powershell 文件,看起来它仍在查找文件,但现在使用任何一个正则表达式都找不到任何内容。
【问题讨论】:
-
如果您愿意编写更多代码,您可以获取所有行,遍历它们直到找到与第一个方法名称匹配的行,然后遍历以下行,将它们打印出来, 直到你得到第二个名字的匹配。
-
我不想打印出来,我想以字符串的形式从 method1 返回到 method2。然后我将从案例陈述中解析出一些东西。现在我没有从我的正则表达式中返回任何东西,所以这是一个开始。
-
然后,您可以将它们收集在一个列表、一个数组或一个大字符串中,而不是打印出来。
-
好吧,一旦我将方法内容转换为字符串,我会将案例内容解析为列表或数组。现在我的正则表达式什么也没返回。就像我说的,方法内容需要进入一个大字符串才能开始。
-
@adv12 我很欣赏任何如何做到这一点的例子......
标签: regex powershell