【问题标题】:RegEx command to get dateRegEx 命令获取日期
【发布时间】:2020-07-24 19:03:57
【问题描述】:

在我的 PowerShell 脚本中使用以下 RegEx 行从 .txt 文件中提取日期。该脚本以年、月、日、小时、分钟、秒 (2020,06,20,00,50,56) 格式读取日期并将其提取到 .csv 文件中。我正在寻找一些关于如何获取日期的指导,以显示没有这种格式的逗号 2020-06-20

这是日期在 .txt 文件中的列出方式,请参阅以 Generated 开头的行:

Node 001 Status Report - Report Version 20200505;
Generated 2020-06-20 00:50:56;

以下是读取和提取日期的脚本部分:

If($_ -imatch 'Generated'){       
   $Date = ([regex]::Matches($_,'\b\d+') | select value).value -join ','
}

【问题讨论】:

  • 了解命名组。本教程几乎涵盖了您想要的内容:javascript.info/regexp-groups#named-groups 我知道它是 JS,但正则表达式概念与语言无关。
  • 以 generate allready 开头的行有连字符。您介意分享您需要转换的数据以及预期结果吗?

标签: regex powershell


【解决方案1】:

您可以使用Select-String 逐行读取每个文件并针对每一行进行模式匹配:

Select-String -Path a.txt,b.txt -Pattern '^Generated (\d{4}-\d{2}-\d{2})' |
    Foreach-Object { $_.Matches.Groups[1].Value }

Select-String 还增加了其他好处。每个模式匹配都是一个MatchInfo 对象,其中包含文件名、匹配的行号以及包含匹配的行。 -AllMatches 开关将尽可能多地匹配每个输入行。 -Path 参数接受路径中的文件和/或通配符数组。 [1] 索引是第一个未命名的捕获组结果,它将与第一组 () 匹配。


顺便说一句,我会验证####-##-## 实际上是一个有效日期,除非您知道在您的数据中始终如此。如果您的系统文化设置允许日期格式,您可以轻松做到这一点:

Select-String -Path a.txt,b.txt -Pattern '^Generated (\d{4}-\d{2}-\d{2})' | Foreach-Object {
    $_.Matches.Groups[1].Value | Where { $_ -as [datetime] }
}

如果文化设置不允许该格式,则需要使用ParseExactTryParseExact 来测试日期。


如果您必须使用当前的数据格式,则可以执行以下操作,以所需格式从逗号分隔的字符串中提取日期:

If($_ -imatch 'Generated'){       
   $Numbers = ([regex]::Matches($_,'\b\d+') | select value).value -join ','
   $Date = ($Numbers -split ',')[0..2] -join '-'
}

【讨论】:

    【解决方案2】:

    您将使用-join ',' 加入逗号作为逗号,如果您想要使用破折号,只需将其更改为破折号。

    If($_ -imatch 'Generated'){       
       $Date = ([regex]::Matches($_,'\b\d+') | select value).value -join '-'
    }
    

    【讨论】:

    • 将逗号更改为破折号有效,谢谢。关于删除时间部分的任何建议。
    • @user2637664,您可以使用$Date = ([regex]::Matches($_,'\b\d+') | select value).value[0..2] -join '-'
    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2020-07-04
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    相关资源
    最近更新 更多