如何在字符串中的多个位置插入字符?

How do I insert chars at multiple places in a string?

我想在每个第二个字符后插入“:” - 最终结果应如下所示 51:40:2e:c0:11:0b:3e:3c

我的解决方案

$s = "51402ec0110b3e3c"

for ($i = 2; $i -lt $s.Length; $i+=3)
{
$s.Insert($i,':')
}

Write-Host $s

returns

51:402ec0110b3e3c
51402:ec0110b3e3c
51402ec0:110b3e3c
51402ec0110:b3e3c
51402ec0110b3e:3c
51402ec0110b3e3c

为什么只把Write-Host放在最后面,$s会返回多次?此外,看起来 $s 在每次循环后都会返回其原始值,覆盖之前的循环...

我原以为循环会完成与此相同的操作:

$s = $sInsert(2,':').Insert(5,':').Insert(8,':').Insert(11,':').Insert(14,':').Insert(17,':').Insert(20,':')

这是因为我nsert returns a new string。它不会就地修改。所以你必须改变

$s.Insert($i,':') 

$s = $s.Insert($i,':')

您也可以通过 -replace 运算符不循环执行此操作:

$s = "51402ec0110b3e3c"
$s = $s -replace '..(?!$)','[=10=]:'

-split-join 的组合也有效:

$s = "51402ec0110b3e3c"
$s = $s -split '(..)' -ne '' -join ':'

将十六进制字符串转换为冒号分隔字符串的另一种方法是使用 -split 运算符和指定两个连续字符的模式。这个...

$s = "51402ec0110b3e3c"
($s -split '(..)').Where({$_}) -join ':'

... 会给出这个 = 51:40:2e:c0:11:0b:3e:3c.

.Where() 过滤掉拆分留下的空白条目。 [咧嘴一笑]

保重,