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