我有一个包含一些开始日期的输入文件,如果这些日期在特定日期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
答案 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)
要与Get-Content
和Foreach-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
}