使用从正则表达式捕获的字符串格式化日期时间

时间:2018-06-29 12:53:37

标签: regex powershell datetime formatting datetime-format

我想做的是使用powershell解析文件并将文件中的某些关键字替换为值。这是可行的,但是使用捕获的正则表达式组格式化日期时间时遇到问题。 正在解析的文件包含以下文本:

  

$ DATETIME $
  $ DATETIME = yyyy-MM-ddTHH:mm:sszzz $
  $ DATETIME = yyyy $

我有一个Powershell脚本,该脚本提取关键字DATETIME并捕获提供的格式。每当我尝试使用捕获的格式时,它都会失败,因为(我怀疑)捕获的字符串变量$ 1被用作格式字符串,而不是$ 1的值。

Get-Content $inputfile) `
    -replace '\$DATETIME[=]?(.*)\$', $(Get-Date -Format '$1') `
| Set-Content $outputfile

如果有人能帮助我,我会很感激。
谢谢

1 个答案:

答案 0 :(得分:5)

您需要将match值传递到回调方法中,或像这样使用

PS> $s = '$DATETIME=yyyy-MM-ddTHH:mm:sszzz$'
PS> [regex]::Replace($s,'\$DATETIME=?([^$]*)\$', {param($match) $(Get-Date -Format $match.Groups[1].Value) })
DATETI6E=2018-06-29T15:09:30+02:00

原始解决方案中的'$1'作为原义的Get-Date字符串传递给$1,因此无法正常工作。这些替换后向引用只能在字符串替换模式中使用,而在匹配需要进一步操作时不能使用。

请注意,我略微修改了模式以使其匹配:

  • \$-一个$字符
  • DATETIME-文字子字符串
  • =?-1或0 =个字符
  • ([^$]*)-第1组(此处捕获的值将用于生成日期时间字符串):$以外的任何0+个字符(如果一行中有超过1个匹配项,它仍然可以正常工作,并且比贪婪(甚至是懒惰的)圆点图案的匹配速度更快)
  • \$-一个$字符