Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
[Regex]::Match()在If内部和外部的行为不同(它也使用[Regex]::Match())_Regex_Powershell - Fatal编程技术网

[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,但我发现需要多行来提取一位数据“令人烦恼”“我。好奇-比赛成为最佳实践的原因是什么?也就是说,提奥提到的命名捕获方法非常有趣。好东西要学!