2016-02-27 123 views
2

想知道是,在的powershell一個正則表達式可以從DD-MON-YY更換日期到DD/MM/YY正則表達式轉換日期格式DD/MM/YY

實施例:25 -FEB-16更改爲25/02/16

+0

不是說不能做(雖然我如果沒有perl eval正則表達式語法,就不能馬上看到),但它肯定不會是一個漂亮的正則表達式。我認爲有更好的方法來寫這個替代品。 –

+0

請使用日期函數imo。 –

+0

因爲正則表達式無法將「FEB」翻譯爲「02」,所以沒有正則表達式。正則表達式是錯誤的方法。 – Bohemian

回答

1

您應該使用[DateTime]::ParseExact(),因爲正則表達式需要12個不同的替換操作,或者使用MatchEvalutor來轉換月份。

例使用正則表達式MatchEvaluator

$MatchEvaluator = { 
    param($match) 

    #Could have used a switch-statement too.. 
    $month = [datetime]::ParseExact($match.Groups[2].Value,"MMM",$null).Month 

    "{0:00}/{1:00}/{2:00}" -f $match.Groups[1].Value, $month, $match.Groups[3].Value 
} 

[regex]::Replace("25-FEB-16","(\d+)-(\w+)-(\d+)", $MatchEvaluator) 
25/02/16 

望着那,我要說的是,只用ParseExact()是一個更好的解決方案:

try { 
    [datetime]::ParseExact("25-FEB-16","dd-MMM-yy", $null).ToString("dd/MM/yy", [cultureinfo]::InvariantCulture) 
} catch { 
    #Invalid date-format 
} 
25/02/16 
+0

不確定爲什麼您將反斜槓放在格式字符串的斜線前面? –

+0

'/'是一個日期分隔符,所以它會輸出文化的分隔符,這對我來說最後是'25.02.16'。使用InvariantCulture也可以修復它。 –

+0

謝謝................. – user664481

1

這裏更好的解決方案是使用日期分析和格式化函數,而不是基於正則表達式的字符串替換。

[DateTime]::ParseExact('25-FEB-16', 'dd-MMM-yy', $null).ToString('dd/MM/yy', [System.Globalization.CultureInfo]::InvariantCulture) 
# => 25/02/16 

如果您在系統中運行日期與另一種語言的月份名稱一起運行,這也會得到您內置的語言環境敏感性。但使用ParseExactInvariantCulture選項意味着語言環境敏感性不會混淆您指定的格式。