我有一个带有字符串的数组,让\xc2\xb4s 说
\n\n$data = @(\n"Haus",\n"Maus",\n"Laus",\n"Schnitzel",\n"Elefant"\n)\n我想根据数组中的多个正则表达式检查它。
\n\n$regexChecks = @(\n".*aus.*",\n".*fant.*"\n)\n我尝试过这样的事情
\n\n$test = $data |? {$regexChecks -notmatch $_}\n\nWrite-Host $test\n我期望只有字符串“Schnitzel”作为输出。
\n您可以将正则表达式作为字符串。这只会返回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 }
-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
| 归档时间: | 
 | 
| 查看次数: | 3278 次 | 
| 最近记录: |