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 是我入门时的一个很好的参考。
我正在从文件中删除以“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 是我入门时的一个很好的参考。