簡體   English   中英

PowerShell RegEx 拆分 MAC 地址

[英]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只在輸入中查找最多一個匹配項。

  • GitHub issue #7867建議引入一個新的-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.

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