regex powershell“-match”不匹配的希望,寻求建议

dzjeubhm  于 2023-06-25  发布在  Shell
关注(0)|答案(1)|浏览(76)

我需要根据名称/文件夹字符串中的任何位置的日期重命名文件和文件夹,前/中/后。
日期格式可以是:

  • 年月日
  • 年-月-日
  • 年月日
  • 年-月-日
  • 年-月-日
  • YYYY-M-D
  • YYYY-MM-D
  • 年-月-日

和日期内分隔符可以是这3个字符中的任意一个

    • (破折号)
  • _(下划线)
  • .(句号)

我原以为下面的匹配字符串(由ChatGPT提供)可以做到这一点,但没有。只有当日期位于字符串的开头时才匹配。

$fileName = "Youghusband Friends 2012-12-14 003.jpg"
    if ($fileName -match  '^(\d{1,2}|\d{2})[-_.](\d{1,2}|\d{2})[-_.](\d{4})(.*)$') {
        $matchedPart = $matches[0]
        Write-Host "FILE_MATCH_C (c) ALL: '$fileName'       Matched Part: '$matchedPart'     matches[1..3]='$matches[1..3]'"
    } elseif ($fileName -match '^(\d{4})[-_.](\d{1,2}|\d{2})[-_.](\d{1,2}|\d{2})(.*)$') {
        $matchedPart = $matches[0]
        Write-Host "FILE_MATCH_D (d) ALL: '$fileName'       Matched Part: '$matchedPart'     matches[1..3]='$matches[1..3]'"
    } else {
        Write-Host "FILE_NO_MATCH: '$fileName'"
    }

结果:

FILE_NO_MATCH: 'Youghusband Friends 2012-12-14 003.jpg'

什么匹配字符串可以修复它?(为什么)
谢谢

7kqas0il

7kqas0il1#

正则表达式的明显问题是使用^(行的开始)和$(行的结束),而不是使用单词边界(\b)。以下是如何使用单个正则表达式处理代码:

$re = '(?x)
\b(?:
    (?<day>[0-9]{1,2})[-_.]
    (?<month>[0-9]{1,2})[-_.]
    (?<year>[0-9]{4})
  |
    (?<year>[0-9]{4})[-_.]
    (?<month>[0-9]{1,2})[-_.]
    (?<day>[0-9]{1,2})
)\b'

$fileName = 'Youghusband Friends 2012-12-14 003.jpg'

if ($fileName -match $re) {
    # if you want to have it as a datetime instace, here you can do:
    # [datetime]::new($Matches['year'], $Matches['month'], $Matches['day'])

    [pscustomobject]@{
        date  = $Matches[0]
        year  = $Matches['year']
        month = $Matches['month']
        day   = $Matches['day']
    }
}
else {
    Write-Host "FILE_NO_MATCH: '$fileName'"
}

有关正则表达式的详细信息,请参见https://regex101.com/r/R0EkUj/1

相关问题