2016-10-11 49 views
1

我试图将某些字符串输入转换为正确的格式以使用MAC地址。将纯字符串转换为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组,每组1个字符的)
  • 我也尝试了类似的正则表达式^(([0-9A-Fa-f]){2}){6}$(6组,每组2个字符),然后替换:$1:$2:$3:$4:$5:$6,但是这给了输出29:9:$3:$4:$5:$6

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

+0

尝试正则表达式'[\ da-fA-F] {2}(?=([\ da-fA-F] {2})+ $)'替换为'$&:' –

+0

'[\ da-fA-F] {2}(?=(?:[\ da- fA-F] {2})+ $)' –

+0

您是否需要实际(预)验证匹配的字符串,还是始终使用与上述相同的格式?如果是的话,乔伊的解决方案将为你工作。 –

回答

8

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

$s -replace '..(?!$)', '$&:' 

此正则表达式两个字符在一个时间相匹配,并且由相同的字符替换它们($&在一个替换字符串表示匹配),随后:。除了在字符串的末尾,这是通过负向预览完成的,以防止在字符串末尾进行匹配。这是有效的,因为正则表达式引擎不会查找向后延伸到以前匹配的匹配项。所以在前两个字符匹配后,下一个匹配只能发生在之后的第一个。这隐含地给你两组字符来替换。

而不是.如果您真的想要,也可以使用[0-9a-f],但我认为输入验证与此处的输出格式不同。输出代码应该能够相信该字符串确实只包含十六进制数字。

验证可以做到简单地

if ($s -notmatch '^[0-9a-f]{12}$') { 
    throw 
} 

它实际上是更容易检测错误字符串比检测更换是否什么也没做这种方式。

+0

哇谢谢乔伊,一个很好的答案! – Bassie

相关问题