2015-07-18 22 views
2

我行剝離出來的文件以「713」,「714」,等我正在這樣做是這樣開始:PowerShell的多StartsWith條款

$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')} 

這種感覺超級馬虎。我怎樣才能改進這個代碼?

+0

考慮在代碼審查堆棧交換中提出類似的問題。 –

+0

@JohnCarpenter CodeReview需要我收集的代碼完整。我不知道如何迴應片段。 – Matt

回答

5

幾件事情會在這裏工作。首先,我們可以使用數組符號與您的數字序列和運算符-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是一個很好的參考,當我開始了。

+0

我同意正則表達式的方法,但是你錯過了-notmatch運算符的LHS參數。 –

+0

@KeithHill我只是假設它是v4語法。將更新謝謝。我意識到我是如何犯這個愚蠢的錯誤。 – Matt

+0

太棒了!正是我需要的。謝謝! – NathanK