Powershell正则表达式混淆

3

目标字符串:

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

有什么想法是为什么会发生这种情况?

因为您正在使用捕获组。 - Maximilian Burszley
1
https://dev59.com/pnI-5IYBdhLWcg3wu7FU - Robin Mackenzie
1个回答

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个匹配项的信息,可能包括捕获组匹配项。

    • 您的正则表达式中的(AM|PM)部分是一个捕获组,因此对于第一个总体匹配项- 8AM -该捕获组的结果为AM
    • $Matches是一个[hashtable],其0键的条目包含总的匹配项;输入<n>包含第n个(无名称的)捕获组结果。
    • 由于[hashtable]的条目枚举在没有保证的情况下发生,因此在这种情况下,1条目恰好在0条目之前列出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接