我想将双引号之间的每个字符串修剪为16个字符

时间:2018-09-10 15:12:24

标签: regex powershell

在Powershell中,我具有以下形式的字符串:

"abcdefghijk","hijk","lmnopqrstuvwxyzabcdefghij"

假设我知道如何转义一个字符(因此,如果我实际上要编写包含字符串标记的字符):

"`"abcdefghijk`",`"hijk`",`"lmnopqrstuvwxyzabcdefghij`""

...我如何将双引号之间的内容修剪到仅16个字符?

因此,预期输出为:

"abcdefghijk","hijk","lmnopqrstuvwxyza"

我是这样想的:

% {$_ -replace "([^\`"]{16})([^\`"]+)", "$1"}

会将所有相关的块匹配为两个后向引用,一个长度为16,另一个是无限长度,然后仅返回第一个。但是,这只会删除长度在16以上的所有内容,从而导致:

"abcdefghijk","hijk",""

这根本不是我所期望的!我在做什么错了?

3 个答案:

答案 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