Powershell Multiple StartsWith子句

Nat*_*anK 2 powershell powershell-4.0

我正在从'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')}
Run Code Online (Sandbox Code Playgroud)

这感觉超级邋.. 我该如何改进这段代码?

Mat*_*att 5

这里几乎没有什么可行的.首先,我们可以使用数字序列和数字序列以及运算符-notin.我们需要提取第一个字符进行简单的比较才能使其正常工作.

$stripped = $stripped | Where{$_.substring(0,3) -notin (713..717)}
Run Code Online (Sandbox Code Playgroud)

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

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

$stripped = $stripped | where{$_ -notmatch "^71[3-7]"}
Run Code Online (Sandbox Code Playgroud)

我们说没有模式,你只是在开始时不想要任何一系列字符串.

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

插入符号^是字符串开头的正则表达式锚点.因此,我们构建了一个我们不想要的字符串数组,并将它们与管道字符连接起来并将其括在括号中.在我的例子中它看起来像这样:

PS C:\Users\Cameron> $dontMatchMe
^(Test|Bagel|123)
Run Code Online (Sandbox Code Playgroud)

如果字符串包含正则表达式控制字符,则需要小心.


如果正则表达式对你来说是新的,我发现RexEgg在我开始时是一个很好的参考.