[Regex] :: Match()在If的内部和外部的行为不同(也使用[Regex] :: Match())

时间:2018-08-19 19:31:45

标签: regex powershell

鉴于"C:\ProgramData\Package Cache\{56e11d69-7cc9-40a5-a4f9-8f6190c4d84d}\VC_redist.x86.exe" /uninstall的uninstallString,我可以使用([Regex]::Match($uninstallString, '^\".*\"').Value)成功地提取引用的文本。但是,如果我测试一下字符串是否具有必需的/ uninstall位,则尝试提取带引号的位,像这样...

if ([Regex]::Match($uninstallString, '^\".*\" +/uninstall').Succes) {
    ([Regex]::Match($uninstallString, '^\".*\"').Value)
}

它不是返回完整字符串,而是仅返回"C:\ProgramData\Package。现在,我的理解是。除了换行符以外,其他所有内容都没有,因此空格应该可以。但是,如果我在字符串中用下划线替换空格,则它可以按预期工作,因此肯定是引起问题的空格。 另外,我很困惑为什么它在If之外而不是在If之外起作用。我给人的印象是,使用[Regex] :: Match()每次使用都会创建一个单独的对象,它们不会互相影响,但是在这里看来它们是一样的。

1 个答案:

答案 0 :(得分:0)

由于要查看是否找到带引号的字符串(路径)以及是否包含开关“ / 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
}