我正在尝试将一些字符串输入转换为正确的格式以使用 MAC 地址。
所以我需要转换
00A0C914C829
to
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组,每组1个字符)
- 我也尝试过类似的正则表达式
^(([0-9A-Fa-f]){2}){6}$
(6组,每组2个字符)然后替换:$1:$2:$3:$4:$5:$6
,但这给出了输出29:9:$3:$4:$5:$6
我认为问题是我不明白团体如何正常工作......如果有人能指出我正确的方向,我将非常感激!
从更小的单位来考虑。你实际上想要插入:
每两个字符之后(字符串末尾除外),而不是尝试捕获每个字符并强制其转换为所需的格式。
$s -replace '..(?!$)', '$&:'
此正则表达式一次匹配两个字符,并将它们替换为相同的字符 ($&
替换字符串中表示匹配)后跟:
。字符串末尾除外,这是通过负向前瞻来防止在字符串末尾匹配的。这是有效的,因为正则表达式引擎不会查找向后延伸到先前匹配的匹配。所以在前两个字符匹配之后,下一个匹配只能发生after第一个。这隐式地为您提供了两个要替换的字符组。
代替.
你也可以使用[0-9a-f]
如果您确实想要,但我认为输入验证与此处的输出格式化是不同的问题。输出代码应该能够相信该字符串确实只包含十六进制数字。
验证可以简单地完成
if ($s -notmatch '^[0-9a-f]{12}$') {
throw
}
实际上,通过这种方式检测格式错误的字符串比检测替换是否不执行任何操作更容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)