簡體   English   中英

Powershell Regex混亂

[英]Powershell Regex confusion

目標字符串:

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

關於為什么會發生這種情況的任何想法?

  • -match運算符只能查找最多1個匹配項。

    • [regex]::Matches()如果你需要多個匹配, [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鍵的條目包含整體匹配; entry <n>包含第n個(未命名的)捕獲組結果。
    • 由於[hashtable]的條目的枚舉在無保證的順序中發生,因此在這種情況下, 1條目恰好在0條目之前列出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM