使用正则表达式选择两个 1 小时 (HH:MM) 字符串值

使用正则表达式选择两个 1 小时 (HH:MM) 字符串值

我有字符串或文本数据:

[string]$hours = @"


10/10/2022  
08:11
14:34
06:23   00:00   
11/10/2022  
08:05
14:28
06:23   00:00   
12/10/2022  
-
-
00:00   00:00   Día Festivo
13/10/2022  
08:10
18:47
10:37   -00:30  
14/10/2022  
07:28
-
00:00   00:00   
-
-

"@

HH:MM我如何才能选择由制表符分隔的两个连续的时间值(其中第二个可以是负值-HH:MM)?

预期输出:

06:23
06:23
00:00
10:37

我只需要它来选择那些由制表符分隔的两位数(如下面的值)但只显示第一次设置的值。

06:23   00:00   
06:23   00:00   
00:00   00:00
10:37   -00:30  

我已经尝试过以下代码,但是无法让它给我我想要的结果。

$hour = $hours.split("`n").ToUpper() | Select-String  "" -AllMatches | ForEach {$_.Matches.value}

答案1

此 PowerShell 逻辑变体将省略-notmatch包含任何大写或小写字母 ( "[a-zA-Z]") 的 [ ] 行匹配。

它将包含 [ -match] 任何以两位数字 ( ^\d{2})、一个冒号 ( :) 开头的行匹配,后跟两位数字 ( \d{2}),后跟三个空格 ( \s{3,}),一个可选连字符 ( -?),后跟两位数字 ( \d{2}),一个冒号 ( :),然后是两位数字 ( ) - 这会为您提供数组中\d{2}并排的值。HH:MM

最后,它会根据默认空间分割这些行结果,并且仅输出第一个索引值,即所需的时间值($_.Split()[0])。

PowerShell(根据示例数据更加具体)

$hours.Split("`n") | Where-Object {$_ -notmatch "[a-zA-Z]" -and $_ -match "^\d{2}:\d{2}\s{3,}-?\d{2}:\d{2}"} | ForEach-Object {$_.Split()[0]};

PowerShell(简称——更具体)

$hours.Split("`n") | ? {
    $_ -notmatch "[a-zA-Z]" -and 
    $_ -match "^\d{2}:\d{2}\s{3,}-?\d{2}:\d{2}" } | % {
    $_.Split()[0]
    };

PowerShell(另一种变体)

笔记: 由于您也特别要求这样做,因此此匹配仅选择包含两位数字、后跟三个空格、后跟任何负两位数或正两位数的行。

$hours.Split("`n") | ? {
    $_ -notmatch "[a-zA-Z]" -and 
    $_ -match "\d{2}\s{3,}-?\d{2}" } | % {
    $_.Split()[0]
    };

支持资源

相关内容