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

Rez*_*oir 3 regex powershell formatting datetime datetime-format

我想做的是使用powershell来解析文件并用值替换文件中的某些关键字.这是有效的,但我在使用捕获的正则表达式组格式化日期时间时出现问题.文件im解析包含以下文本:

$ 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
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我,我会很感激.
谢谢

Wik*_*żew 5

您需要将匹配值传递给回调方法,或者像使用它一样使用它

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
Run Code Online (Sandbox Code Playgroud)

'$1'你原来的解决方案传递给Get-Date作为文字$1字符串,如预期因此不能正常工作.这些替换反向引用只能用于字符串替换模式,但在匹配需要进一步操作时不能使用.

请注意,我稍微修改了模式以匹配:

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