【问题标题】:PowerShell regex to pick out elapsed timePowerShell正则表达式来挑选经过的时间
【发布时间】:2013-06-26 03:59:51
【问题描述】:

我是 powershell 脚本的新手,对 Regex 不太擅长... 我想创建一个正则表达式,它将从以下文本文件中挑选时间...

gfskf dakdshadk daksdkdahkd daksdhasdkh () zadf sflh f.d / sd lhlfhlj f 12hrs:10mins:05sec fsfsf fsfjhsfjh

我想将小时数设为 12,分钟数设为 10,秒数设为 5。

$hour= [regex]::match($line,$hour_regex).Groups[1].Value
$mins= [regex]::match($line,$mins_regex).Groups[1].Value
$sec= [regex]::match($line,$sec_regex).Groups[1].Value

所以本质上我需要三个正则表达式来从文件中提取相关数据。

提前致谢!

【问题讨论】:

    标签: regex powershell scripting


    【解决方案1】:

    使用一个正则表达式:

    $r = '(\d+)hrs:(\d+)mins:(\d+)sec'
    $i = 'hlfhlj f 12hrs:10mins:05sec fsfsf f'
    $result = [regex]::match($i,$r)
    $hour = $result.Groups[1].Value
    $mins = $result.Groups[2].Value
    $sec = $result.Groups[3].Value
    

    【讨论】:

      【解决方案2】:

      只是为了好玩:

      $a = "gfskf dakdshadk daksdkdahkd daksdhasdkh () zadf sflh f.d / sd lhlfhlj f 12hrs:10mins:05sec fsfsf fsfjhsfjh"
      
      $hour,$min, $sec = $a -split '(\d\d)' | ? { $_ -match '\d\d' }
      

      【讨论】:

      • +1 表示原创性,但我不想依赖这一点,因为其余文本可能包含也可能不包含更多 2 位以上的数字。
      • @AnsgarWiechers 好点!我已经采取了示例行'字面意思';)
      【解决方案3】:

      由于还没有人提及,您也可以使用-match 运算符。子匹配可以通过$matches 哈希表访问:

      Get-Content "C:\path\to\your.txt" | ? {
        $_ -match '(\d+)hrs:(\d+)mins:(\d+)sec'
      } | % {
        $h = $matches[1]
        $m = $matches[2]
        $s = $matches[3]
      
        "{0}:{1}:{2}" -f ($h, $m, $s)
      }
      

      【讨论】:

        【解决方案4】:

        使用正则表达式捕获组。 "(\d+)hrs:(\d+)mins:(\d+)sec" 会将号码捕获到可以访问的组中。将结果保存在MatchCollection 中以检查结果。像这样,

        $line = "sflh f.d / sd lhlfhlj f 12hrs:10mins:05sec fsfsf"
        PS C:\> $mc = [regex]::match($line, "(\d+)hrs:(\d+)mins:(\d+)sec")
        PS C:\> $mc.Groups[1].value
        12
        PS C:\> $mc.Groups[2].value
        10
        PS C:\> $mc.Groups[3].value
        05
        

        【讨论】:

          【解决方案5】:

          你可以试试:

          $b= [regex]".* (\d*)hrs:(\d*)mins:(\d*)sec.*"
          $hours=$b.Match($a).groups[1].value
          $minutes=$b.Match($a).groups[2].value
          $seconds=$b.Match($a).groups[3].value
          

          【讨论】:

            【解决方案6】:

            如果你像我一样对正则表达式不放心,你可以使用 split 函数:

            PS>$t="gfskf dakdshadk daksdkdahkd daksdhasdkh () zadf sflh f.d / sd lhlfhlj f 12hrs:10mins:05sec fsfsf fsfjhsfjh"
            
            PS>$slices=$t.split(@(" ",":"))
            $hours=($slices[12]).substring(0,2)
            $mins=($slices[13]).substring(0,2)
            $secs=($slices[14]).substring(0,2)
            

            【讨论】:

              【解决方案7】:
              PS> $s -replace '^.+ (\d+hrs:\d+mins:\d+sec).*$','$1' -split '\D+' | where {$_}
              12
              10
              05
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2017-02-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-10-29
                • 2021-09-27
                • 1970-01-01
                相关资源
                最近更新 更多