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

问题描述 投票:-1回答:3

在Powershell中,我有一个这种形式的字符串:

"abcdefghijk","hijk","lmnopqrstuvwxyzabcdefghij"

假设我知道如何转义一个字符(因此,如果我真的要写它包括字符串标记):

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

...如何在双引号之间修剪任何东西,只有16个字符?

因此预期的输出是:

"abcdefghijk","hijk","lmnopqrstuvwxyza"

我想这个:

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

将任何相关的块匹配为两个反向引用,长度为16,长度为无限长,仅返回第一个。但是,这只会删除长度为16或更长的所有内容,从而导致:

"abcdefghijk","hijk",""

这不是我的预期!我究竟做错了什么?

regex powershell
3个回答
1
投票

答案很简单:将$ 1左右的双引号更改为单引号:

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

这有点反直觉,但这背后的原因是:当你使用一对双引号时,$1被解释为一个变量名并插入到它的内容中,在这种情况下它是空的,甚至在它到达之前正则表达式引擎。

或者,您也可以逃离$

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

0
投票

我想出了以下内容,它应该与你想要做的非常接近:

(\w+)\W+(\w+)\W+(\w+){16}

https://regex101.com/r/kfEAFl/1

在这里你有三个组,你可以以任何方式加入它们。


0
投票

这是一个没有正则表达式的例子:

$longArray = @("1221111111111111111111111111", "213")
$shortArray = $longArray.ForEach{$_.ToString().PadRight(16, " ").SubString(0,16)}
write-host $shortArray
# Writes 1221111111111111 213             
© www.soinside.com 2019 - 2024. All rights reserved.