[英]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.