2016-02-27 28 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选项意味着语言环境敏感性不会混淆您指定的格式。