目标字符串:
8AM - 10AM (local time)
12PM - 1PM (local time)
我可以使用以下表达式从https://regexr.com/中提取时间:
\d{1,2}(AM|PM)
但是,我无法在powershell中这样做:
cls
$var = "8AM - 10AM (local time)
12PM - 1PM (local time)"
if ($var -match "\d{1,2}(AM|PM)")
{
$matches
}
PS输出:
Name Value
---- -----
1 AM
0 8AM
但是,当我在PS中使用以下脚本时:
cls
$var = "8AM - 10AM (local time)"
[regex]::Matches($var,"\d{1,2}(AM|PM)").Value
它提供了正确的输出:
8AM
10AM
有关为何发生这种情况的任何想法?
答案 0 :(得分:4)
-match
运算符最多只查找 1 匹配。
[regex]::Matches()
确实是正确的选择。Select-String
cmdlet,但速度要慢得多:('8AM - 10AM (local time)' | Select-String -AllMatches '\d{1,2}(AM|PM)').Matches.Value
因此,对于-match
,自动$Matches
结果变量只包含有关该1匹配的信息,可能包括 capture-group 匹配。
(AM|PM)
部分是一个捕获组,因此对于第一次整体匹配 - 8AM
- 捕获组的结果为AM
。$Matches
是[hashtable]
,其0
项的条目包含整体匹配;条目<n>
包含第n个(未命名的)捕获组结果。[hashtable]
的条目枚举没有保证顺序,因此1
条目恰好在0
条目之前列出。