如何检查数组是否与PowerShell中的特定字符串部分匹配?

时间:2016-02-09 15:16:30

标签: regex powershell powershell-v3.0 powershell-v4.0

我是PowerShell脚本编写的新手,正在开发POC。我卡住了,无法继续前进,所以我在这个网站上发布我的问题以获得一些想法/答案。

任务是将一组值与Regex进行比较。但我没有得到理想的输出。这是我现在写的代码:

 $array = @('MBS\FY16\11 May\Sirius Agreements\04 Build','MBS\FY16\11 May\Sirius Agreements\05 Build')
$values = 'MBS\FY16\11 May|MBS\FY16\12 Jan'
$Splitvalues = $values.Split('|')
[regex]$Regex = ‘(?i)^(‘ + (($Splitvalues | % {[regex]::escape($_)}) –join “|”) + ‘)$’

 if($array -match $Regex)
 {
    echo "Matched"
 }
 else
 {
    echo "notmatched"
 }`

要求是从$ Values匹配其中任何一个。所以我用管道拆分它们,然后用两个数组值创建一个Regex。

当我与$ array的实际值数组进行比较时,它失败了。它总是转到else部分。

我在想当我们使用正则表达式匹配时,如果确切的单词与源值匹配,它将返回true。或许我使用错误的正则表达式。

我只需要匹配确切的部分值" MBS \ FY16 \ 11月"或" MBS \ FY16 \ 6月12日"并返回匹配的值或消息。

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

您无需创建新的[regex]对象即可使用-match运算符:

$ValuesToFind = 'MBS\FY16\11 May','MBS\FY16\12 Jan'
$MatchPattern = ($ValuesToFind |%{ [regex]::Escape($_) }) -join '|'

现在,当您将-match应用于数组时,将返回数组中的所有匹配项,这听起来像是您问题的完美结果。

因此,您可以简化整个过程:

$Array        = 'MBS\FY16\11 May\Sirius Agreements\04 Build','MBS\FY16\11 May\Sirius Agreements\05 Build'
$ValuesToFind = 'MBS\FY16\11 May','MBS\FY16\12 Jan'

$MatchPattern = ($ValuesToFind |%{ [regex]::Escape($_) }) -join '|'

$Array -match $MatchPattern