我正在尝试将一些字符串输入转换成使用MAC地址的正确格式。
所以我需要转换
00A0C914C829至
00:A0:C9:14:C8:29我有这个PowerShell脚本来实现这个目标:
$string = "00A0C914C829"
$out = $string -replace "([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])", '$1$2:$3$4:$5$6:$7$8:$9$10:$11$12'
$out其中产出:
00:A0:C9:14:C8:29但这一判决似乎长得离谱。
有什么办法能使这件事更简洁吗?
()将每个部分分组到变量中,这就是为什么它如此长的原因。我也尝试过与^([0-9A-Fa-f]){12}$进行匹配,但这给出了输出9$2:$3$4:$5$6:$7$8:$9$10:$11$12 (12个组,每个组一个字符)。^(([0-9A-Fa-f]){2}){6}$ (每组6个字符),然后替换:$1:$2:$3:$4:$5:$6,但这给出了输出29:9:$3:$4:$5:$6。我想问题是我不明白团队是如何正常运作的..。如果有人能给我指明正确的方向,我会非常感激的!
发布于 2016-10-11 12:08:14
从较小的单位来考虑。实际上,您希望在每两个字符之后插入: (除了字符串的末尾),而不是试图捕获每个字符并将其强制设置为所需的格式。
$s -replace '..(?!$)', '$&:'此正则表达式一次匹配两个字符,并将它们替换为相同的字符(替换字符串中的$&表示匹配),然后是:。除了在字符串的末尾,这是通过一个负的前瞻性阻止匹配在字符串的末尾。这是因为regex引擎不会寻找向后扩展到以前匹配的匹配。因此,在前两个字符匹配之后,下一个匹配只能在第一个字符之后进行。这隐式地为您提供了要替换的两个字符组。
如果您真的需要的话,也可以使用.代替[0-9a-f],但我认为这里的输入验证问题与输出格式问题不同。输出代码应该能够信任字符串实际上只包含十六进制数字。
验证可以简单地进行,如
if ($s -notmatch '^[0-9a-f]{12}$') {
throw
}实际上,用这种方法检测格式错误的字符串要比检测替换是否没有任何作用要容易得多。
发布于 2021-11-01 15:28:48
来补充乔伊的答案。.NET有包含在验证中构建的PhysicalAddress类。解析方法接受多种格式。
001122334455
00-11-22-33-44-55
0011.2233.4455 (仅限.NET 5及更高版本)
00:11:22:33:44:55 (仅限.NET 5及更高版本)
F0-E1-D2-C3-B4-A5
f0-e1-d2-c3-b4-a5 (仅限.NET 5及更高版本)
您需要安装PS7来解析其中的一些内容。我需要它来解析Cisco IOS格式
https://stackoverflow.com/questions/39976679
复制相似问题