如何解决PowerShell RegEx 拆分 MAC 地址
我需要使用 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
类:
[System.Net.NetworkInformation.PhysicalAddress]::Parse('708BCDBC8A0D')
对于 .Net 5(Powershell Core 我认为基于它)添加了 TryParse
方法,但在 .Net 4.5 中没有 {{ 1}} 方法。
要检查 .Net 框架 powershell 运行使用 TryParse
[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)}'
,
注意:我相信这个答案是正确的,并且 - 希望 - 有帮助;如果您不同意,请告诉我们为什么。
正如您所观察到的,反映最近 (scalar-input[1]) automatic $Matches
variable 的结果的 regular-expression-based match
operation 只包含 最后 嵌入的捕获组 ((...)
) 捕获的内容的实例。
通常,-match
只在输入中查找至多 ONE 个匹配项。
-
GitHub issue #7867 提议引入一个新的
-matchall
运算符,该运算符将查找 所有 匹配项并将它们作为 数组 返回。
直接使用作为 PowerShell 正则表达式功能基础的 [regex]
类 (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
,string splitting operator:
# 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
未 填充。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。