22

我试图在 powershell 中找到一种方法来删除多个空格。

但我发现如何在 php 中做到这一点。"删除多个空格"

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

如何在 powershell 中实现相同的目标?

我的字符串是这样的

Xcopy Source  Desination

有些行可能在 Source 和 Destination 之间包含多个空格。

4

3 回答 3

71

如果您希望将多个连续的空白字符折叠成一个空格,那么您可以使用运算符来执行此-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

第一个参数 to-replace是要匹配的正则表达式模式,第二个参数是将替换任何匹配项的文本。 \s将匹配一个空白字符,并+表示匹配一个或多个匹配项,因此,换句话说,一个或多个相邻的空白字符将被替换为单个空格。

没有空白规范化的替换

如果您不需要将所有空白字符规范化为空格,因此可以保持独立空白字符保持不变,那么对于长字符串,您可能会看到这种变体的更好性能......

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

虽然两者都产生相同长度的字符串,但未规范化的替换使单个空格、单个制表符和单个换行符空白运行未修改。无论相邻的空白字符是否相同,这都是一样的。

附加文件

于 2011-12-31T06:56:18.883 回答
0
'[     Hello,     World!     ]' -replace '^\[\s+','[' -replace '\s+]$',']' -replace '\s+',' '

Bacon 有解释 powershell 很有趣。即使我知道 powershells 转义字符是 ` '[',我也不得不转义。'\'

于 2020-09-02T03:14:56.050 回答
0

另一种方式。-split 在左侧拆分可变空白:

-split 'Xcopy Source  Destination' -join ' '

Xcopy Source Destination
于 2020-09-02T04:05:37.130 回答