[英]PowerShell RegEx to split MAC address
我需要使用 RegEx 驗證 RAW 格式的 MAC 地址,並將其拆分為 6 個值乘 2 個字符的數組。
當我使用以下模式時,我只獲得捕獲組的最后一次迭代的內容:
PS C:\Windows\System32> "708BCDBC8A0D" -match "^([0-9a-z]{2}){6}$"
True
PS C:\Windows\System32> $Matches
Name Value
---- -----
1 0D
0 708BCDBC8A0D
PS C:\Windows\System32>
我可以用什么模式捕獲所有組?
我需要這個結果:
0 = 708BCDBC8A0D
1 = 70
2 = 8B
3 = CD
4 = BC
5 = 8A
6 = 0D
您不能使用單個組定義捕獲多個組。 不必要時避免使用 RegEx,因為它會占用大量 CPU。 價值數百萬的記錄。
對於 MAC,您可以使用特殊的PhysicalAddress
class:
[System.Net.NetworkInformation.PhysicalAddress]::Parse('708BCDBC8A0D')
For.Net 5(我認為基於它的 Powershell Core)添加了TryParse
方法,但在.Net 4.5 中沒有TryParse
方法。
要檢查 .Net 框架 powershell 運行使用[System.Reflection.Assembly]::GetExecutingAssembly().ImageRuntimeVersion
'708BCDBC8A0D' -match "^$('([A-F0-9]{2})' * 6)$"; $Matches
'708BCDBC8A0D' -match '^([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})$'; $Matches
'@(0..5) | ForEach-Object {'708BCDBC8A0D'.Substring($_ * 2, 2)}'
@(
[String]::new('708BCDBC8A0D'[0..1]),
[String]::new('708BCDBC8A0D'[2..3]),
[String]::new('708BCDBC8A0D'[4..5]),
[String]::new('708BCDBC8A0D'[6..7]),
[String]::new('708BCDBC8A0D'[8..9]),
[String]::new('708BCDBC8A0D'[10..11])
)
注意:我相信這個答案是正確的並且 - 希望 - 有幫助; 如果您不同意,請告訴我們原因。
正如您所觀察到的, 自動$Matches
變量反映了最近(標量輸入[1] ) 基於正則表達式的match
操作的結果,它只包含嵌入式捕獲組( (...)
) 捕獲。
通常, -match
只在輸入中查找最多一個匹配項。
-matchall
運算符,它將查找所有匹配項並將它們作為數組返回。 直接使用作為 PowerShell 正則表達式功能基礎的[regex]
class ( System.Text.RegularExpressions.Regex
) 已經提供了這種能力,在這種情況下甚至不需要捕獲組。
# Note: Inline option (?i) makes the regex case-INsensitive
# (which PowerShell's operators are BY DEFAULT).
PS> [regex]::Matches('708BCDBC8A0D', '(?i)[0-9a-e]{2}').Value
70
8B
CD
BC
8A
0D
但是,有點技巧,您也可以使用-split
字符串拆分運算符:
# Note: No inline option needed: -split - like -match and -replace -
# is case-INsensitive by default.
PS> '708BCDBC8A0D' -split '([0-9a-e]{2})' -ne ''
70
8B
CD
BC
8A
0D
筆記:
正則表達式必須包含在(...)
(一個捕獲組)中,以明確指示-split
將其匹配的內容包含在結果中; 由於正則表達式通常描述感興趣的子字符串之間的分隔符,因此通常不包括其匹配項。
在這種情況下,我們只關心“分隔符”,而它們之間的子字符串在這里是空字符串,所以我們用-ne ''
過濾掉它們。
[1] 如果-match
操作的 LHS 是一個數組(一個集合),則對每個元素進行匹配,並返回匹配元素的子數組(而不是單個布爾值)。 在這種情況下,不會填充$Matches
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.