将纯字符串转换为MAC地址格式

Bas*_*sie 2 regex powershell mac-address

我正在尝试将一些字符串输入转换为正确的格式以使用MAC地址.

所以我需要转换

00A0C914C829
Run Code Online (Sandbox Code Playgroud)

至

00:A0:C9:14:C8:29
Run Code Online (Sandbox Code Playgroud)

我有这个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
Run Code Online (Sandbox Code Playgroud)

哪个输出:

00:A0:C9:14:C8:29
Run Code Online (Sandbox Code Playgroud)

但是那个正则表达式看起来非常漫长.

有没有办法使这更简洁?


  • 我想我需要将每个部分组合成变量(),这就是为什么它如此之长.我也试过匹配^([0-9A-Fa-f]){12}$,但这给了输出9$2:$3$4:$5$6:$7$8:$9$10:$11$12(12组,每组1个字符)
  • 我也尝试了类似的正则表达式^(([0-9A-Fa-f]){2}){6}$(6组,每组2个字符)然后替换:$1:$2:$3:$4:$5:$6,但这给了输出29:9:$3:$4:$5:$6

我认为问题是我不明白团队如何正常工作......如果有人能指出我正确的方向,我真的很感激!

Joe*_*oey 8

以较小的单位来考虑它.实际上,您希望:在每两个字符后插入(字符串末尾除外),而不是尝试捕获每个字符并将其强制为所需格式.

$s -replace '..(?!$)', '$&:'
Run Code Online (Sandbox Code Playgroud)

此正则表达式一次匹配两个字符,并用相同的字符替换它们($&在替换字符串中表示匹配)后跟:.除了在字符串的末尾,这是通过负向前瞻来防止字符串末尾的匹配.这是有效的,因为正则表达式引擎不会查找向后扩展到先前匹配的匹配项.因此,在匹配前两个字符后,下一个匹配只能在第一个匹配后发生.这隐式地为您提供了两个要替换的字符组.

相反的.,你也可以使用[0-9a-f],如果你真的想要的,但我觉得输入验证比这里输出的格式不同的问题.输出代码应该能够相信字符串确实只包含十六进制数字.

验证可以简单地完成

if ($s -notmatch '^[0-9a-f]{12}$') {
  throw
}
Run Code Online (Sandbox Code Playgroud)

而且通过这种方式检测格式错误的字符串实际上比通过检测替换是否无效而更容易.