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

Regex 使用从正则表达式捕获的字符串格式化日期时间,regex,powershell,datetime,formatting,datetime-format,Regex,Powershell,Datetime,Formatting,Datetime Format,我想做的是使用powershell解析文件,并用值替换文件中的某些关键字。这是工作,但我有一个问题,格式的日期时间使用捕获的正则表达式组。 文件im解析包含以下文本: $DATETIME$ $DATETIME=yyyy-MM-ddTHH:MM:sszzz$ $DATETIME=yyyy$ 我有一个powershell脚本,它提取关键字DATETIME并捕获提供的格式。每当我尝试使用捕获的格式时,它都会失败,因为(我怀疑)捕获的字符串变量$1被用作格式字符串,而不是$1的值 Get-Content

我想做的是使用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
如果有人能帮忙,我将不胜感激。

谢谢

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

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'
作为文本
$1
字符串传递给
Get Date
,因此无法按预期工作。这些替换反向引用只能在字符串替换模式中使用,但不能在匹配需要进一步操作时使用

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

  • \$
    -a
    $
    字符
  • DATETIME
    -文字子字符串
  • =?
    -1或0
    =
    字符
  • ([^$]*)
    -第1组(此处捕获的值将用于生成日期时间字符串):除
    $
    之外的任何0+字符(如果一行上有超过1个匹配项,它仍然有效,并且匹配速度将快于贪婪(甚至懒惰)点模式)
  • \$
    -a
    $
    字符

应该使用
$match.Groups[1]
而不是
$match.value
@NahuelFouilleul True,抱歉,修复了。谢谢Wiktor。工作起来很有魅力!有没有一种方法可以通过'-replace'方法实现这一点?@Reznoir没有,因为它只需要字符串替换模式。