2

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

gfskf dakdshadk daksdkdahkd daksdhasdkh () zadf sflh fd / 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

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

提前致谢!

4

7 回答 7

2

使用一个正则表达式:

$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
于 2013-06-28T11:39:07.377 回答
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' }
于 2013-06-28T11:57:38.693 回答
1

由于还没有人提到它,您也可以使用-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)
}
于 2013-06-28T11:59:24.553 回答
0

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

$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
于 2013-06-28T11:41:56.803 回答
0

你可以试试 :

$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
于 2013-06-28T11:43:59.190 回答
0

如果像我一样你对正则表达式不放心,你可以使用 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)
于 2013-06-28T11:52:45.430 回答
0
PS> $s -replace '^.+ (\d+hrs:\d+mins:\d+sec).*$','$1' -split '\D+' | where {$_}
12
10
05
于 2013-06-28T12:08:07.733 回答