微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PowerShell RegEx 拆分 MAC 地址

如何解决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

不过,稍微有点技巧,您也可以使用 -splitstring 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?