[Regex]::Match()在If内部和外部的行为不同(它也使用[Regex]::Match())
给定一个卸载字符串[Regex]::Match()在If内部和外部的行为不同(它也使用[Regex]::Match()),regex,powershell,Regex,Powershell,给定一个卸载字符串“C:\ProgramData\Package Cache\{56e11d69-7cc9-40a5-a4f9-8f6190c4d84d}\VC\U redist.x86.exe”/uninstall我可以成功地用([Regex]::Match($uninstallString,^\“*”).Value)提取引用的文本。但是,如果我测试字符串是否具有所需的/uninstall位,然后尝试提取引用的位,如下所示 if ([Regex]::Match($uninstallString
“C:\ProgramData\Package Cache\{56e11d69-7cc9-40a5-a4f9-8f6190c4d84d}\VC\U redist.x86.exe”/uninstall
我可以成功地用([Regex]::Match($uninstallString,^\“*”).Value)提取引用的文本。但是,如果我测试字符串是否具有所需的/uninstall位,然后尝试提取引用的位,如下所示
if ([Regex]::Match($uninstallString, '^\".*\" +/uninstall').Succes) {
([Regex]::Match($uninstallString, '^\".*\"').Value)
}
值不是完整的字符串,它只返回“C:\ProgramData\Package
。现在,我的理解是。除了换行符以外,一切都可以,所以空格应该可以。但是,如果我在字符串中用下划线替换空格,它会按预期工作,因此肯定是空格导致了问题。
此外,我还不明白为什么它在If之外工作,而在If内部工作。我的印象是使用[Regex]::Match()会在每次使用时创建单独的对象,这些对象不会相互交互,但在这里它们似乎是相互作用的。因为您希望查看是否找到带引号的字符串(路径),以及它是否包含开关'/uninstall',
我会这样做:
$uninstallString = '"C:\ProgramData\Package Cache\{56e11d69-7cc9-40a5-a4f9-8f6190c4d84d}\VC_redist.x86.exe"'
if ($uninstallString -match '^(?<path>".*")(?:\s+(?<switch>/uninstall))?') {
$uninstallPath = $matches['path'] # at least the path (quoted string) is found
$uninstallSwitch = $matches['switch'] # if '/uninstall' switch is not present, this will result in $null
}
$uninstallString='“C:\ProgramData\Package Cache\{56e11d69-7cc9-40a5-a4f9-8f6190c4d84d}\VC_redist.x86.exe”
如果($uninstallString-match'^(?“*”)(:\s+(?/uninstall))?){
$uninstallPath=$matches['path']#至少找到了路径(带引号的字符串)
$uninstallSwitch=$matches['switch']#如果'/uninstall'开关不存在,这将导致$null
}
FYI,您不需要在regex中转义引号。它们没有特殊意义。此外,您应该使用[regex]::IsMatch
无法复制此代码,这是您正在使用的实际代码吗?(顺便说一句,您的示例中有一个输入错误,它是成功,而不是成功)作为一种最佳实践,我建议使用-match
比较运算符和$matches
自动变量。@我一直在使用-match,但我发现需要多行来提取一位数据“令人烦恼”“我。好奇-比赛成为最佳实践的原因是什么?也就是说,提奥提到的命名捕获方法非常有趣。好东西要学!