我有字符串或文本数据:
[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]
};
支持资源
-
钥匙
strSeparator
用于分割每个字符串的字符,默认为空格(空格/换行符/制表符) -
要检索元素,请指定其编号,PowerShell 会自动从 0 开始对数组元素进行编号。
例如这个数组:
PS C:\> $myArray = 64,"Hello",3.5,"World", "Demo"
将具有自动索引号:
+----+-------+-----+-------+------+ | 0 | 1 | 2 | 3 | 4 | +----+-------+-----+-------+------+ | 64 | Hello | 3.5 | World | Demo | +----+-------+-----+-------+------+
将索引号视为距起始元素的偏移量。
返回数组中的所有元素:
PS C:\> $myArray
返回数组中的第一个元素:
PS C:\> $myArray[0] 64