将纯字符串转换为 MAC 地址格式
Convert plain string to MAC Address format
我正在尝试将一些字符串输入转换为正确的格式以使用 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])", ':::::'
$out
输出:
00:A0:C9:14:C8:29
但是那个正则表达式看起来长得离谱。
有什么方法可以使它更简洁吗?
- 我想我需要使用
()
将每个部分分组到变量中,这就是它这么长的原因。我也尝试匹配 ^([0-9A-Fa-f]){12}$
,但这给出了输出 9:::::
(12 组,每组 1 个字符)
- 我也尝试了类似的正则表达式
^(([0-9A-Fa-f]){2}){6}$
(6 组,每组 2 个字符)然后替换::::::
,但这给出了输出 29:9::::
我认为问题是我不明白小组是如何正常工作的...如果有人能指出我正确的方向,我将不胜感激!
从更小的单位考虑。您实际上想在每两个字符后插入 :
(字符串末尾除外),而不是试图捕获每个字符并将其强制为所需格式。
$s -replace '..(?!$)', '$&:'
这个正则表达式一次匹配两个字符,并用相同的字符替换它们(替换字符串中的 $&
表示匹配),然后是 :
。除了在字符串的末尾,这是通过防止在字符串末尾进行匹配的否定前瞻来完成的。这是有效的,因为正则表达式引擎不会寻找向后延伸到先前匹配的匹配。因此,在前两个字符匹配后,下一个匹配只能发生在第一个字符 之后。这隐含地为您提供了两个字符组来替换。
如果您确实需要,您也可以使用 [0-9a-f]
而不是 .
,但我认为输入验证与此处的输出格式化是不同的问题。输出代码应该能够相信字符串确实只包含十六进制数字。
验证可以像
一样简单地完成
if ($s -notmatch '^[0-9a-f]{12}$') {
throw
}
实际上,用这种方法检测格式错误的字符串比检测替换字符串是否无效更容易。
添加到 Joey 的回答中。 .NET 具有 PhysicalAddress
class 和内置验证。 parse 方法接受多种格式
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 格式
我正在尝试将一些字符串输入转换为正确的格式以使用 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])", ':::::'
$out
输出:
00:A0:C9:14:C8:29
但是那个正则表达式看起来长得离谱。
有什么方法可以使它更简洁吗?
- 我想我需要使用
()
将每个部分分组到变量中,这就是它这么长的原因。我也尝试匹配^([0-9A-Fa-f]){12}$
,但这给出了输出9:::::
(12 组,每组 1 个字符) - 我也尝试了类似的正则表达式
^(([0-9A-Fa-f]){2}){6}$
(6 组,每组 2 个字符)然后替换::::::
,但这给出了输出29:9::::
我认为问题是我不明白小组是如何正常工作的...如果有人能指出我正确的方向,我将不胜感激!
从更小的单位考虑。您实际上想在每两个字符后插入 :
(字符串末尾除外),而不是试图捕获每个字符并将其强制为所需格式。
$s -replace '..(?!$)', '$&:'
这个正则表达式一次匹配两个字符,并用相同的字符替换它们(替换字符串中的 $&
表示匹配),然后是 :
。除了在字符串的末尾,这是通过防止在字符串末尾进行匹配的否定前瞻来完成的。这是有效的,因为正则表达式引擎不会寻找向后延伸到先前匹配的匹配。因此,在前两个字符匹配后,下一个匹配只能发生在第一个字符 之后。这隐含地为您提供了两个字符组来替换。
如果您确实需要,您也可以使用 [0-9a-f]
而不是 .
,但我认为输入验证与此处的输出格式化是不同的问题。输出代码应该能够相信字符串确实只包含十六进制数字。
验证可以像
一样简单地完成if ($s -notmatch '^[0-9a-f]{12}$') {
throw
}
实际上,用这种方法检测格式错误的字符串比检测替换字符串是否无效更容易。
添加到 Joey 的回答中。 .NET 具有 PhysicalAddress
class 和内置验证。 parse 方法接受多种格式
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 格式