在PowerShell中删除多个空格

26

我在尝试寻找一种在PowerShell中去除多个空格的方法。

但我发现的是如何在PHP中做到这一点。"Removing more than one white-space"

可能有类似的正则表达式可用。

如何在PowerShell中实现相同的效果?

我的字符串是这样的

Xcopy Source  Desination

有些行可能在源和目标之间包含多个空格。

3个回答

76
如果您想将多个连续的空格字符折叠成一个空格,则可以使用-replace运算符来完成。给定...
PS> $beforeReplace = '   [   Hello,   World!   ]   '
PS> $beforeReplace
   [   Hello,   World!   ]   
PS> $beforeReplace.Length
29

...你需要这样调用-replace操作符...

PS> $afterReplace = $beforeReplace -replace '\s+', ' '
PS> $afterReplace
 [ Hello, World! ] 
PS> $afterReplace.Length
19
-replace的第一个参数是用来匹配的正则表达式模式,第二个参数是将替换任何匹配项的文本。\s将匹配空格字符,+表示匹配一个或多个出现,因此,换句话说,一个或多个相邻的空格字符将被替换为单个空格。

不进行空格规范化的替换

如果您不需要将所有空格字符normalize为空格,因此独立的空格字符可以保持不变,则对于长字符串,使用这种变体可能会获得更好的性能...

PS> $afterReplace = $beforeReplace -replace '\s{2,}', ' '
PS> $afterReplace
 [ Hello, World! ] 
PS> $afterReplace.Length
19
\s{2,} 使用量词,意思是“匹配前面的元素至少两次”,因此单独的空格字符不会被替换。当输入字符串包含混合的空格字符时...
PS> $beforeReplace = "1Space: ;2Space:  ;1Tab:`t;2Tab:`t`t;1Newline:`n;2Newline:`n`n;"
PS> $beforeReplace
1Space: ;2Space:  ;1Tab:    ;2Tab:      ;1Newline:
;2Newline:

;
PS> $beforeReplace.Length
57

请注意这两种方法的结果有所不同...

PS> $afterReplaceNormalized = $beforeReplace -replace '\s+', ' '
PS> $afterReplaceNormalized
1Space: ;2Space: ;1Tab: ;2Tab: ;1Newline: ;2Newline: ;
PS> $afterReplaceNormalized.Length
54
PS> $afterReplaceUnnormalized = $beforeReplace -replace '\s{2,}', ' '
PS> $afterReplaceUnnormalized
1Space: ;2Space: ;1Tab: ;2Tab: ;1Newline:
;2Newline: ;
PS> $afterReplaceUnnormalized.Length
54

虽然两者生成的字符串长度相同,但未规范化的替换会保留单个空格、单个制表符和单个换行符的空白字符序列不变。无论相邻的空白字符是否相同,这都能正常工作。

附加文档


感谢Bacon先生。它对我来说做得到。 - Samselvaprabu
使用 Trim()、TrimStart() 和/或 TrimEnd() 是毫无疑问的更好选择。 - Robert Allan Hennigan Leahy
24
首先,我的回答是一个可行的替代方案,所以我不明白为什么它应该被点踩。其次,Trim*()方法只能作用于字符串的开头和/或结尾,而作者给出的示例中需要移除的空格位于字符串中间,这是Trim*()无法处理的。 - Lance U. Matthews
点赞,因为我同意BACON关于“trim”命令集限制的理由。其次,这是我将使用的解决方案。 - Jay
15
使用Trim()TrimStart()和/或TrimEnd()是明显错误的答案,但如果不是这样的话,你认为是否有更友好的方式来表达? - travis

0
另一种方法。在左侧拆分会根据变量空格进行拆分:
-split 'Xcopy Source  Destination' -join ' '

Xcopy Source Destination

0
'[     Hello,     World!     ]' -replace '^\[\s+','[' -replace '\s+]$',']' -replace '\s+',' '

Bacon有解释,PowerShell很有趣。我不得不用'\'转义'[',尽管我知道PowerShell的转义字符是`。


虽然 PS 转义字符是 \,但它只适用于 " 双引号字符串内,而不适用于你示例中的 ' 单引号字符串,实际上这是正则表达式语法,其中 \\ 是转义字符。 - Rob at TVSeries.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接