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