Powershell Regex混乱

时间:2018-01-26 03:56:36

标签: regex powershell powershell-v3.0

目标字符串:

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

有关为何发生这种情况的任何想法?

1 个答案:

答案 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条目之前列出。