将数组与多个正则表达式匹配(来自数组)

时间:2018-12-11 08:51:09

标签: powershell

我有一个包含字符串的数组,比方说

$data = @(
"Haus",
"Maus",
"Laus",
"Schnitzel",
"Elefant"
)

我想针对数组中的多个正则表达式进行检查。

$regexChecks = @(
".*aus.*",
".*fant.*"
)

我尝试过这样的事情

$test = $data |? {$regexChecks -notmatch $_}

Write-Host $test

我希望仅将字符串“ Schnitzel”作为输出。

2 个答案:

答案 0 :(得分:4)

您可以将正则表达式作为字符串。这只会返回Schnitzel

$data = @(
"Haus",
"Maus",
"Laus",
"Schnitzel",
"Elefant"
)

$Regex = '.*Schnitzel.*'

$test = $data | ? { $_ -match $Regex }

Write-Host $test

如果您要检查多个正则表达式,请使用|分隔它们

这将输出SchnitzelMaus

$Regex = '.*Schnitzel.*|.*Maus.*'

这将返回SchnitzelMausLausHaus

$Regex = '.*Schnitzel.*|.*aus.*'

编辑

您还可以拥有一个正则表达式数组,并将其与|连接起来:

$RegexArray = @(
    '.*Schnitzel.*',
    '.*Maus.*'
)

$Regex = $RegexArray -join '|'

$test = $data | ? { $_ -match $Regex }

答案 1 :(得分:3)

正则表达式匹配比文字比较(-eq)甚至通配符匹配(-like)要慢得多,因此应尽可能减少比较次数。由于您具有一组正则表达式,因此您可以将它们简单地合并为一个这样的子表达式:

$regexChecks = '.*aus.*', '.*fant.*'
$re = $regexChecks -join '|'

如果要匹配多个文字字符串,则可以告诉PowerShell首先对其进行转义(以防万一它们包含点,方括号等特殊字符):

$re = ($regexChecks | ForEach-Object {[regex]::Escape($_)}) -join '|'

此外,您无需在表达式中添加开头和结尾.*,因为默认情况下不固定正则表达式。只是把它们放出去。

$regexChecks = 'aus', 'fant'
$re = ($regexChecks | ForEach-Object {[regex]::Escape($_)}) -join '|'

您也不需要Where-ObjectForEach-Object来枚举数组的元素,因为PowerShell运算符本身就是枚举器。只需直接在数组上使用运算符即可:

$test = $data -match $re