我正在使用 Powershell 搜索一个大文件,以查找包含 mm-dd-yyyy 格式的所有字符串的所有字符串。然后我需要提取字符串以确定日期是否为有效日期。该脚本在大多数情况下都有效,但返回的结果太多,并且没有提供我想要的所有信息。文件中有像 012-34-5678 这样的字符串,为此我会失败,并且 12-34-5678 的值将作为无效日期返回。我也无法返回找到无效日期的行号。有人可以看看我下面的脚本,看看我可能做错了什么吗?
两行注释掉的行将返回字符串编号和在该行找到的整个字符串,但我不知道如何仅从行中取出 mm-dd-yyyy 部分并确定它是否是有效日期。
任何帮助将不胜感激。谢谢。
#$matches = Select-String -Pattern $regex -AllMatches -Path "TestFile_2013_01_06.xml" |
#$matches | Select LineNumber,Line
$regex = "\d{2}-\d{2}-\d{4}"
$matches = Select-String -Pattern $regex -AllMatches -Path "TestFile_2013_01_06.xml" |
Foreach {$_.Matches | Foreach {$_.Groups[0] | Foreach {$_.Value}}}
foreach ($match in $matches) {
#$date = [datetime]::parseexact($match,"MM-dd-yyyy",$null)
if (([Boolean]($match -as [DateTime]) -eq $false ) -or ([datetime]::parseexact($match,"MM-dd-yyyy",$null).Year -lt "1800")) {
write-host "Failed $match"
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在正则表达式本身中进行大量验证,使其更加健壮:
$regex = "(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2}"
Run Code Online (Sandbox Code Playgroud)
以上匹配 01/01/1900 到 12/31/2099 之间的任何日期,并接受正斜杠、破折号、空格和点作为日期分隔符。它并没有拒绝像2月30日或31日,11月31日等日期无效
| 归档时间: |
|
| 查看次数: |
13370 次 |
| 最近记录: |