在Powershell中,我有一个这种形式的字符串:
"abcdefghijk","hijk","lmnopqrstuvwxyzabcdefghij"
假设我知道如何转义一个字符(因此,如果我真的要写它包括字符串标记):
"`"abcdefghijk`",`"hijk`",`"lmnopqrstuvwxyzabcdefghij`""
...如何在双引号之间修剪任何东西,只有16个字符?
因此预期的输出是:
"abcdefghijk","hijk","lmnopqrstuvwxyza"
我想这个:
% {$_ -replace "([^\`"]{16})([^\`"]+)", "$1"}
将任何相关的块匹配为两个反向引用,长度为16,长度为无限长,仅返回第一个。但是,这只会删除长度为16或更长的所有内容,从而导致:
"abcdefghijk","hijk",""
这不是我的预期!我究竟做错了什么?
答案很简单:将$ 1左右的双引号更改为单引号:
-replace "([^`"]{16})([^`"]+)", '$1'
这有点反直觉,但这背后的原因是:当你使用一对双引号时,$1
被解释为一个变量名并插入到它的内容中,在这种情况下它是空的,甚至在它到达之前正则表达式引擎。
或者,您也可以逃离$
:
-replace "([^`"]{16})([^`"]+)", "`$1"
我想出了以下内容,它应该与你想要做的非常接近:
(\w+)\W+(\w+)\W+(\w+){16}
https://regex101.com/r/kfEAFl/1
在这里你有三个组,你可以以任何方式加入它们。
这是一个没有正则表达式的例子:
$longArray = @("1221111111111111111111111111", "213")
$shortArray = $longArray.ForEach{$_.ToString().PadRight(16, " ").SubString(0,16)}
write-host $shortArray
# Writes 1221111111111111 213