2017-06-28 45 views
2

$文件使用正則表達式第一次出現分裂是一個文件名如何在PowerShell中

$List = gci $path | select -expandproperty Name,然後我會通過$列表中的每個文件$循環。)

我想以後NAME1採取分開並操縱它,但是我的代碼在name1中給了我name2的一部分。

我使用-(空格破折號空格)作爲name1和name2的分隔符,但是在某些情況下,name2包含一個額外的-(空格破折號空格)。

下面是我在做什麼:

PS D:\> $File="foo - bar - bar2.ext" 
[regex]$testreg = "(?<name1>.*)\s-\s(?<name2>.*)\.(?<ext>\w+$)" 
$m = $testreg.Match($File) 
$m.Groups["name1"].value 
$m.Groups["name2"].value 
$m.Groups["ext"].value 

foo - bar 
bar2 
ext 

我希望它給我:

foo 
bar - bar2 
ext 

這樣我可以在以後操作foo和使用結果來重命名文件。

回答

3

眼前的解決辦法是在你的第一個捕獲組使用非貪婪量詞:遵循.*?

[regex]$testreg = "(?<name1>.*?)\s-\s(?<name2>.*)\.(?<ext>\w+$)" 

量詞是貪婪默認情況下,使.*(?<name1>.*)\s-會匹配最後的-實例(前面有一個空格字符)。


另一種選擇 - 假設你的第一個捕獲組的目標令牌沒有嵌入空白 - 就是讓你的第一個捕獲小組賽非空白隻字:

[regex]$testreg = "(?<name1>[^\s]*)\s-\s(?<name2>.*)\.(?<ext>\w+$)" 
+1

感謝。我曾嘗試在分隔符上使用非貪婪,比如'(\ s- \ s)?',但我沒有想到將它放入組中。 在這種情況下,'name1'和'name2'包含空格,所以非貪婪量詞就是答案。 – Xalorous

+0

@Xalorous:我很高興聽到它的工作。請注意,'_'_by本身_就意味着_optional_,它與非貪婪不同:作爲非貪婪修飾符,'?'修飾其他量詞,即'*'或'+'。 – mklement0

+0

所以,用我自己的話來重新解釋它,並測試理解:如果量詞是「+」或「*'」,那麼「??」修飾語會告訴它在第一次匹配時停止增加匹配修改組和下一組。沒有它會增加比賽直到它不能增加更多。非貪婪和貪婪? – Xalorous