【问题标题】:Removing more than one white space in powershell在powershell中删除多个空格
【发布时间】:2012-01-30 23:46:09
【问题描述】:

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

但我发现如何在 php.ini 中执行此操作。 "Removing more than one white-space"

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

如何在 powershell 中达到同样的效果?

我的字符串是这样的

Xcopy Source  Desination

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

【问题讨论】:

    标签: regex powershell powershell-2.0 removing-whitespace


    【解决方案1】:

    如果您希望将多个连续的空白字符折叠成一个空格,那么您可以使用-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,} 使用quantifier 表示“匹配前面的元素至少两次”;因此,不会替换独立的空白字符。当输入字符串包含混合的空白字符时...

    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
    

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

    其他文档

    【讨论】:

    • 谢谢培根先生。它为我完成了这项工作。
    • 使用 Trim()、TrimStart() 和/或 TrimEnd() 无疑是更好的选择。
    • 首先,我的回答是一个可行的替代解决方案,所以我不明白为什么它值得一票否决。其次,Trim*() 方法专门对字符串的开头和/或结尾进行操作,而作者给出了一个字符串示例,其中要删除的空格位于字符串的中间,而 Trim*() 将忽略。
    • 赞成,因为我同意 BACON 的理由,关于“trim”命令集的限制。其次,这是我将使用的解决方案。
    • @RobertAllanHenniganLeahy 使用Trim()TrimStart() 和/或TrimEnd() 是一个明确错误的答案,但您是否认为如果不是这样,会有更友好的方式说明那个?
    【解决方案2】:
    '[     Hello,     World!     ]' -replace '^\[\s+','[' -replace '\s+]$',']' -replace '\s+',' '
    

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

    【讨论】:

    • 虽然是的,但 PS 转义字符是 `,它只能在 " 双引号字符串内工作,而不是在您的示例中的 ' 单引号字符串内工作,这实际上是正则表达式语法,其中 `\` 是转义字符。
    【解决方案3】:

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

    -split 'Xcopy Source  Destination' -join ' '
    
    Xcopy Source Destination
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2021-03-10
      • 2014-02-18
      相关资源
      最近更新 更多