Regex Powershell正则表达式混淆

Regex Powershell正则表达式混淆,regex,powershell,powershell-3.0,Regex,Powershell,Powershell 3.0,目标字符串: 8AM - 10AM (local time) 12PM - 1PM (local time) 我可以用这个表达式从中提取时间: \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

目标字符串:

8AM - 10AM (local time)
12PM - 1PM (local time)
我可以用这个表达式从中提取时间:

\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
你知道为什么会这样吗?

  • -match
    运算符最多只查找一个匹配项

    • [regex]::Matches()
      确实是正确的选择,如果您需要多个匹配项
    • 或者,使用
      Select-String
      cmdlet,但速度会慢得多:
      ('8AM-10AM(当地时间)'Select String-AllMatches'\d{1,2}(AM | PM')。Matches.Value
  • 因此,对于
    -match
    ,自动
    $Matches
    结果变量仅包含关于该1个匹配的信息,可能包括捕获组匹配

    • 正则表达式的
      (AM | PM)
      部分是捕获组,因此对于第一个整体匹配-
      8AM
      ,捕获组的结果是
      AM
    • $Matches
      是一个
      [hashtable]
      ,其带有
      0
      键的条目包含整体匹配;条目
      包含第n个(未命名)捕获组结果
    • 由于
      [hashtable]
      项的枚举没有保证顺序,因此在这种情况下,
      1
      项恰好列在
      0
      项之前

因为您使用的是捕获组。