【发布时间】:2021-10-22 00:41:05
【问题描述】:
我想用 -replace 在 powershell 中转换以下 iban
来自
HU42 1177 3016 1111 1018 0000 0000
到
11773016-11111018-00000000
那么我怎样才能编写一个正确的模式来替换第三个空格和第二个空格呢?然后删除所有剩余空间
【问题讨论】:
标签: regex powershell replace
我想用 -replace 在 powershell 中转换以下 iban
来自
HU42 1177 3016 1111 1018 0000 0000
到
11773016-11111018-00000000
那么我怎样才能编写一个正确的模式来替换第三个空格和第二个空格呢?然后删除所有剩余空间
【问题讨论】:
标签: regex powershell replace
另一种选择
"{1}{2}-{3}{4}-{5}{6}" -f -split 'HU42 1177 3016 1111 1018 0000 0000'
输出
11773016-11111018-00000000
【讨论】:
$Old = "HU42 1177 3016 1111 1018 0000 0000"
$SplitOld = $old.Split(" ")
$New = $SplitOld[1] + $SplitOld[2]+ "-" + $SplitOld[3] + $SplitOld[4] + "-" + $SplitOld[5] + $SplitOld[6]
或单行:
$Old = "HU42 1177 3016 1111 1018 0000 0000"
$New = $old.Split(" ")[1] + $old.Split(" ")[2]+ "-" + $old.Split(" ")[3] + $old.Split(" ")[4] + "-" + $old.Split(" ")[5] + $old.Split(" ")[6]
【讨论】:
您可以使用概念上相当简单的两步 -replace 方法:
'HU42 1177 3016 1111 1018 0000 0000' -replace '^.+? | ' -replace '(\d{8})(?!$)', '$1-'
^.+? | 删除第一个以空格分隔的标记及其后面的空格,以及所有剩余的空格。
(\d{8})(?!$) 匹配除字符串末尾的组之外的所有 8 位组($,通过 negative look-ahead assertion、(?!...)),并将每个组替换为自身($1,第一次捕获group) 后跟-,从而有效地插入-。
【讨论】:
您可以像这样使用-split、-replace 和-join 的组合:
$iban = 'HU42 1177 3016 1111 1018 0000 0000'
(($iban -split '\s', 2)[-1] -replace '\s') -split '(\d{8})' -ne '' -join '-'
结果:
11773016-11111018-00000000
我从你的评论中看到你也想出了一个办法,通过:
("HU42 1177 3016 1111 1018 0000 0000" -replace "(^.{14})\s(.{9})\s(.{9})",'$1-$2-$3').Substring(5) -replace " ",""
记住$1-$2-$3 需要用单引号括起来
【讨论】:
("HU42 1177 3016 1111 1018 0000 0000" -replace "(^.{14})\s(.{9})\s(.{9})",'$1-$2-$3').Substring(5) -replace " ","",它也会起作用。
您真的需要使用正则表达式来解决您的问题吗?
$iban = 'HU42 1177 3016 1111 1018 0000 0000'
$splitted = -split $iban
(1,3,5 | ForEach-Object { -join $splitted[$_++, $_] }) -join '-'
问题越来越像 Code Golf :)
$iban = 'HU42 1177 3016 1111 1018 0000 0000 1704 2345'
$l = 0
-join (
-split $iban |
ForEach-Object {
if( $l -eq 0 ) {
$r, $l = '', 8
} else {
$d = ''
if( $r.length -eq $l ) {
$l += 9
$d = '-'
}
$r = "$r$d$_"
}
}
)
$r
【讨论】: