2014-09-02 45 views
0

我很努力地理解PowerShell中的正則表達式。上週五用戶麥克-Z幫了我一個腳本的命名約定這樣來提取一組文件夾的數量 -powershell正則表達式捕獲拉動版本號

Core_1.1.2 
Core_1.3.4 

下面的正則表達式;

-replace '.*_(\d+(\.\d+){1,3})', '$1') 

完美地提取僅數字(例如「1.1.2」)。

不幸的是,後來我意識到有幾個文件夾名稱在版本號後面有一些其他的垃圾文本(例如Core_1.2.4_Prod)。我試圖自己調整上面的正則表達式,以使它也忽略尾部文本,但我沒有太多。我使用各種在線正則表達式生成器以及我自己有限的正則表達式的經驗,但我沒有得到任何地方;我能夠生成正則表達式應該捕獲我需要的文本,但它們在PowerShell中不起作用。嚴謹地說,上面的工作正則表達式(就像在PowerShell中工作一樣)在我使用的任何正則表達式工具中都失敗了。

基本上,給定文件夾名稱的列表,這樣

Core_1.1.2 
Core_1.2.4_Prod 
Core_1.2.6 
Core_1.3.1_Prod 
Core_1.4.4 

我需要捕獲只是版本號。另外,如果你能夠解釋爲什麼正則表達式能夠工作,那麼我將非常感謝,因爲我現在對PS正則表達式非常困惑。

回答

3

你只需要在最後在你的模式添加.*

.*_(\d+(\.\d+){1,3}).* 

所以,你的代碼會是這樣,

-replace '.*_(\d+(\.\d+){1,3}).*', '$1') 

DEMO

默認情況下,在所有的語言替換功能應該只替換匹配的字符。您的正則表達式.*_(\d+(\.\d+){1,3})與版本號中的最後一位數字匹配。它不會匹配剩下的部分。因此,無論何時用$1替換匹配的字符,尾隨部分_Prod應與第一個捕獲組中的字符一起打印,因爲尾部不匹配。只需匹配尾部,以便用$1即,版本號)代替整行。

+0

只需在演示站點中刪除正則表達式中的最後一個'。*'。你應該看到不同之處。 – 2014-09-02 14:33:04

+0

太棒了,這不僅工作完美,但你已經設法幫助我理解爲什麼我試圖無論如何。 – 2014-09-02 15:16:19

+0

因爲'另外,如果你可以解釋爲什麼正則表達式的工作原因,我會非常感激,因爲在這一點上我被PS正則表達式困惑了。'請求解釋是很好的。 – 2014-09-02 15:20:42