Powershell - 正则表达式日期范围替换

时间:2016-07-10 06:52:29

标签: regex date powershell range

我有一个包含一些开始日期的输入文件,如果这些日期在特定日期1995-01-01之前(YYYY-MM-DD格式),则用最小值替换日期,例如

<StartDate>1970-12-23</StartDate> 

将更改为

<StartDate>1995-01-01</StartDate>

<StartDate>1996-05-12</StartDate>没问题,会保持不变。

我希望使用正则表达式替换,但检查日期范围是否按预期工作。我希望在范围检查中使用这样的东西

\b(?:1900-01-(?:3[01]|2[1-31])|1995/01/01)\b

2 个答案:

答案 0 :(得分:2)

您可以使用'<StartDate>(\d{4}-\d{2}-\d{2})</StartDate>'这样的简单正则结构来匹配<StartDate>,4位数,-,2位数,-,2位数和</StartDate> ,然后使用回调方法将捕获的数据解析为第1组日期,并使用Martin的代码来比较日期。如果日期在定义的日期之前,则使用最小日期,否则,使用捕获的日期。

$callback = {
  param($match)
  $current = [DateTime]$match.Groups[1].Value
  $minimum = [DateTime]'1995-01-01'

  if ($minimum -gt $current)
  {
    '<StartDate>1995-01-01</StartDate>'
  }
  else {
    '<StartDate>' + $match.Groups[1].Value + '</StartDate>'
  }
}

$text = '<StartDate>1970-12-23</StartDate>'
$rex = [regex]'<StartDate>(\d{4}-\d{2}-\d{2})</StartDate>'
$rex.Replace($text, $callback)

enter image description here

要与Get-ContentForeach-Object一起使用,您可以如上定义$callback并使用

$rex = [regex]'<StartDate>(\d{4}-\d{2}-\d{2})</StartDate>'
(Get-Content $path\$xml_in) | ForEach-Object {$rex.Replace($_, $callback)} | Set-Content $path\$outfile

答案 1 :(得分:1)

您不必在此使用regex。只需将日期转换为DateTime并进行比较:

$currentDate = [DateTime]'1970-12-23'
$minDate = [DateTime]'1995-01-01'

if ($minDate -gt $currentDate)
{
    $currentDate = $minDate
}