【问题标题】:Trim whitespace from middle of string从字符串中间修剪空格
【发布时间】:2008-10-19 19:49:43
【问题描述】:

我正在使用以下正则表达式来捕获始终为 50 个字符长的固定宽度“描述”字段:

(?.{50})

我的问题是描述有时包含很多个空格,例如

"FLUID        COMPRESSOR                          "

谁能提供一个正则表达式:

  1. 修剪所有结尾的空格
  2. 将单词之间的任何空格折叠成一个单个空格

【问题讨论】:

    标签: regex parsing


    【解决方案1】:

    用两个或多个空格代替一个空格:

    s/  +/ /g
    

    编辑:对于任何空白(不仅仅是空格),如果您使用的是与 perl 兼容的正则表达式库,则可以使用 \s 以及出现次数的花括号语法,例如

    s/\s\s+/ /g
    

    s/\s{2,}/ /g
    

    编辑 #2:忘记了 /g 全局后缀,谢谢 JL

    【讨论】:

    • 或者甚至只是 s/\s+/ /g -- 它偶尔会将一个空格映射到另一个空格,但这并不重要。但当然,全局后缀确实很重要。
    • 不幸的是,所有提议的正则表达式都会在末尾留下一个空格,如果它在初始字符串中。
    【解决方案2】:
    str = Regex.Replace(str, " +( |$)", "$1");
    

    【讨论】:

    • 太棒了!此正则表达式正确处理单词之间和字符串末尾的空格。
    • 我打算提出同样的建议。 :)
    【解决方案3】:

    Perl 变体: 1) s/\s+$//; 2) s/\s+/ /g;

    【讨论】:

      【解决方案4】:

      C#:

      仅当您想要修剪所有空白时 - 在开头、结尾和中间。

           string x = Regex.Replace(x, @"\s+", " ").Trim();
      

      【讨论】:

        【解决方案5】:

        您要求使用正则表达式是否有特殊原因?它们可能不是完成这项任务的最佳工具。

        类似的替代品

         s/[ \t]+/ /g
        

        应该压缩内部空格(实际上,它也会压缩前导和尾随空格,但听起来这不是问题。),并且

        s/[ \t]+$/$/
        

        将处理尾随空格。 [我在这里使用sedish 语法。你没有说你喜欢什么口味。]


        马上,我看不出用一个表达式就能做到这一点。

        【讨论】:

        【解决方案6】:

        由于压缩空白和修剪边缘的空白在概念上是不同的操作,我喜欢分两步进行:

        re.replace("s/\s+/ /g", str.strip())
        

        不是最有效的,但可读性很强。

        【讨论】:

          【解决方案7】:

          /(^[\s\t]+|[\s\t]+([\s\t]|$))/g 替换为$2(开始|中间/结束)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-09-16
            • 2010-10-20
            • 1970-01-01
            • 2011-05-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多