Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 我想将双引号之间的每个字符串都修剪为16个字符_Regex_Powershell - Fatal编程技术网

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

Regex 我想将双引号之间的每个字符串都修剪为16个字符,regex,powershell,Regex,Powershell,在Powershell中,我有以下形式的字符串: "abcdefghijk","hijk","lmnopqrstuvwxyzabcdefghij" 将任何相关块匹配为两个反向引用,一个长度为16,另一个长度为无限,并仅返回第一个。但是,这只会删除长度为16或更长的所有内容,从而导致: "abcdefghijk","hijk","" “hijk” 这根本不是我所期望的!我做错了什么?我提出了以下几点,这些应该与您试图做的非常接近: (\w+)\W+(\w+)\W+(\w+){16} 这里有三个

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

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

"abcdefghijk","hijk","" “hijk”
这根本不是我所期望的!我做错了什么?

我提出了以下几点,这些应该与您试图做的非常接近:

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


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

这里有一个不使用正则表达式的示例:

$longArray = @("1221111111111111111111111111", "213")
$shortArray = $longArray.ForEach{$_.ToString().PadRight(16, " ").SubString(0,16)}
write-host $shortArray
# Writes 1221111111111111 213             

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

-replace "([^`"]{16})([^`"]+)", '$1'
这有点违反直觉,但背后的原因是:当您使用一对双引号时,
$1
被解释为变量名并插入到其内容中,在本例中是空的,甚至在它到达正则表达式引擎之前

或者,您也可以转义
$

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

您忘了转义
$
。正则表达式不是解决此问题的好方法。关于
“‘abc\'defghijk’、‘hijk’、‘lmnopqrstuv’”
?显然,在这个字符串中,中间的双引号是要转义的,尽管转义使用的语法是一个开放的问题。或者仅仅是
“‘abcdefghijk’、‘hijk’、‘lmno’、‘yzabc’”
,它有不平衡的双引号?你的问题只是文本潜在问题的冰山一角。您可能真正需要的是编译器(生成抽象语法树的标记器/词法分析器+解析器/语法分析器),或者避免解析文本的问题。
$longArray = @("1221111111111111111111111111", "213")
$shortArray = $longArray.ForEach{$_.ToString().PadRight(16, " ").SubString(0,16)}
write-host $shortArray
# Writes 1221111111111111 213             
-replace "([^`"]{16})([^`"]+)", '$1'
-replace "([^`"]{16})([^`"]+)", "`$1"