我有一个包含字符串的数组,比方说
$data = @(
"Haus",
"Maus",
"Laus",
"Schnitzel",
"Elefant"
)
我想针对数组中的多个正则表达式进行检查。
$regexChecks = @(
".*aus.*",
".*fant.*"
)
我尝试过这样的事情
$test = $data |? {$regexChecks -notmatch $_}
Write-Host $test
我希望仅将字符串“ Schnitzel”作为输出。
答案 0 :(得分:4)
您可以将正则表达式作为字符串。这只会返回Schnitzel
$data = @(
"Haus",
"Maus",
"Laus",
"Schnitzel",
"Elefant"
)
$Regex = '.*Schnitzel.*'
$test = $data | ? { $_ -match $Regex }
Write-Host $test
如果您要检查多个正则表达式,请使用|
分隔它们
这将输出Schnitzel
和Maus
$Regex = '.*Schnitzel.*|.*Maus.*'
这将返回Schnitzel
,Maus
,Laus
和Haus
$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-Object
或ForEach-Object
来枚举数组的元素,因为PowerShell运算符本身就是枚举器。只需直接在数组上使用运算符即可:
$test = $data -match $re