Powershell 多个 StartsWith 子句

Powershell Multiple StartsWith clauses

我正在从文件中删除以“713”、“714”等开头的行。我目前这样做是这样的:

$stripped = $stripped | where{-Not $_.StartsWith('713')}
$stripped = $stripped | where{-Not $_.StartsWith('714')}
$stripped = $stripped | where{-Not $_.StartsWith('715')}
$stripped = $stripped | where{-Not $_.StartsWith('716')}
$stripped = $stripped | where{-Not $_.StartsWith('717')}

这感觉超级马虎。我该如何改进此代码?

几乎没有什么东西可以在这里工作。首先,我们可以将数组表示法与您的数字序列和运算符 -notin 结合使用。我们需要提取第一个字符进行简单比较才能使其正常工作。

$stripped = $stripped | Where{$_.substring(0,3) -notin (713..717)}

因此,如果前 3 个字符在数字范围内,则会跳过它们。

对于其他解决方案,我们可以使用正则表达式,因为您的数字中存在明显的模式。您可以使用模式来不匹配字符串开头的 713 - 717 中的数字。

$stripped = $stripped | where{$_ -notmatch "^71[3-7]"}

假设没有模式,您只是不想要开头的一系列字符串中的任何一个。

$dontMatchMe = "^(" + ("Test","Bagel","123" -join "|") + ")"
$stripped = $stripped | where{$_ -notmatch $dontMatchMe}

插入符号 ^ 是字符串开头的正则表达式锚点。所以我们构建了一个我们不需要的字符串数组,并用管道字符连接它们并将其括在方括号中。在我的示例中它看起来像这样:

PS C:\Users\Cameron> $dontMatchMe
^(Test|Bagel|123)

您需要小心处理您的字符串,以防它们包含正则表达式控制字符。


如果您不熟悉正则表达式,我发现 RexEgg 是我入门时的一个很好的参考。