PowerShell -match无法匹配任意位置日期,求正则修正方案
解决文件名任意位置日期匹配问题
问题根源
你原有的正则表达式使用了^字符串开头锚点,这会强制要求日期必须出现在文件名的最起始位置,因此无法匹配位于中间或结尾的日期。此外,原正则中(\d{1,2}|\d{2})是冗余写法,\d{1,2}已经可以匹配1位或2位数字,无需重复定义。
修正后的正则表达式
针对你需要支持的8种日期格式(核心为日-月-年和年-月-日两类,日/月可1位或2位,分隔符支持-/_/.),以下是匹配任意位置日期的正则:
1. 日-月-年格式(如 14-12-2012、4.2_2023)
\b(\d{1,2})[-_.](\d{1,2})[-_.](\d{4})\b
\b是单词边界,确保匹配的是独立的日期片段,避免误匹配文件名中连续数字的一部分[-_.]匹配任意一种支持的分隔符\d{1,2}匹配1位或2位的日/月,\d{4}匹配4位年份
2. 年-月-日格式(如 2012_12.14、2023-2-4)
\b(\d{4})[-_.](\d{1,2})[-_.](\d{1,2})\b
逻辑与上面一致,仅调整了年、月、日的顺序
修正后的PowerShell代码
$fileName = "Youghusband Friends 2012-12-14 003.jpg" if ($fileName -match '\b(\d{1,2})[-_.](\d{1,2})[-_.](\d{4})\b') { $matchedDate = $matches[0] $day, $month, $year = $matches[1..3] Write-Host "匹配到日-月-年格式日期: '$fileName' 匹配部分: '$matchedDate' 日: $day, 月: $month, 年: $year" } elseif ($fileName -match '\b(\d{4})[-_.](\d{1,2})[-_.](\d{1,2})\b') { $matchedDate = $matches[0] $year, $month, $day = $matches[1..3] Write-Host "匹配到年-月-日格式日期: '$fileName' 匹配部分: '$matchedDate' 年: $year, 月: $month, 日: $day" } else { Write-Host "未匹配到日期: '$fileName'" }
运行结果
匹配到年-月-日格式日期: 'Youghusband Friends 2012-12-14 003.jpg' 匹配部分: '2012-12-14' 年: 2012, 月: 12, 日: 14
内容的提问来源于stack exchange,提问作者hydra3333
相关产品推荐
相关产品推荐

