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

Ste*_*uer 5 powershell

我有一个带有字符串的数组,让\xc2\xb4s 说

\n\n
$data = @(\n"Haus",\n"Maus",\n"Laus",\n"Schnitzel",\n"Elefant"\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想根据数组中的多个正则表达式检查它。

\n\n
$regexChecks = @(\n".*aus.*",\n".*fant.*"\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试过这样的事情

\n\n
$test = $data |? {$regexChecks -notmatch $_}\n\nWrite-Host $test\n
Run Code Online (Sandbox Code Playgroud)\n\n

我期望只有字符串“Schnitzel”作为输出。

\n

Sim*_*onS 8

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

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

$Regex = '.*Schnitzel.*'

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

Write-Host $test
Run Code Online (Sandbox Code Playgroud)

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

这将输出SchnitzelMaus

$Regex = '.*Schnitzel.*|.*Maus.*'
Run Code Online (Sandbox Code Playgroud)

这将返回Schnitzel, Maus,LausHaus

$Regex = '.*Schnitzel.*|.*aus.*'
Run Code Online (Sandbox Code Playgroud)

编辑

您还可以拥有一个正则表达式数组,并使用以下命令将它们连接起来|

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

$Regex = $RegexArray -join '|'

$test = $data | ? { $_ -match $Regex }
Run Code Online (Sandbox Code Playgroud)


Ans*_*ers 5

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

$regexChecks = '.*aus.*', '.*fant.*'
$re = $regexChecks -join '|'
Run Code Online (Sandbox Code Playgroud)

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

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

此外,您不需要.*向表达式添加前导和尾随,因为默认情况下不锚定正则表达式。把它们排除在外吧。

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

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

$test = $data -match $re
Run Code Online (Sandbox Code Playgroud)

  • +1因为答案比我的知识更多。不知道如何省略“.*”,也没有考虑“转义”。好的! (2认同)