【问题标题】:How to 'Trim' a multi line string?如何“修剪”多行字符串?
【发布时间】:2012-12-21 18:06:37
【问题描述】:

我试图在多行字符串上使用Trim(),但是只有第一行将Trim()。我似乎无法弄清楚如何从每行的开头删除所有空格。

string temp1 = "   test   ";
string temp2 = @"   test
                    line 2 ";

MessageBox.Show(temp1.Trim());
//shows "test".

MessageBox.Show(temp2.Trim());
//shows "test"
        "       line2 ".

我可以在多行字符串上使用Trim/TrimStart/TrimEnd 吗?

【问题讨论】:

    标签: c# string text trim


    【解决方案1】:

    使用正则表达式的工作解决方案:

    string TrimMultiline(string text)
    {
        return new Regex(@"^[^\S\n]+(.+?)\s*$", RegexOptions.Multiline).Replace(text, "$1");
    }
    

    或者如果您想要 TrimStart(这与 Martin Smith 的评论相同的 RegEx):

    string TrimStartMultiline(string text)
    {
        return new Regex(@"^[^\S\n]+(.+)$", RegexOptions.Multiline).Replace(text, "$1");
    }
    

    【讨论】:

      【解决方案2】:

      题外话,但在 PowerShell 中使用此代码时请注意:

      $content = Get-Content file.txt;
      $trimmed = $content.Trim();
      

      因为$content 是一个数组 行,但并不明显,所以 PS 会神奇地为每一行执行一个Trim

      强制转换成字符串:

      [System.String]$content = Get-Content file.txt;
      

      由于 PowerShell 然后删除所有回车符以形成单行,因此无法正常工作..!

      【讨论】:

        【解决方案3】:

        您可以使用正则表达式来执行此操作。

        这是一个 PHP(我在 Mac 上,所以没有 C#)preg_replace 示例

        <?php
        
        $test = "   line 1     
             line 2 with blanks at end     
             line 3 with tabs at end        ";
        
        print $test;
        
        $regex = '/[ \t]*\n[ \t]*/';
        $res = trim(preg_replace($regex, "\n", $test));
        print $res;
        

        正则表达式 preg_replace 删除换行符周围的空白,trim 删除开头和结尾的空白。

        C# Regex.Replace 方法应该像 preg_replace 一样工作。

        【讨论】:

        • 您能详细说明一下吗?你会使用什么正则表达式?给出一些示例代码。
        • 我在 PHP 中添加了一个示例,因为我解释了 C# Regex.Replace 方法应该类似于 PHP preg_replace 函数。
        • 在 C# 中 temp2 = new Regex(@"^[^\S\n]+(.+)$", RegexOptions.Multiline).Replace(temp2 , "$1"); 可以完成这项工作。
        【解决方案4】:

        分割、修剪、连接

        string[] lines = temp1.Split(new []{Environment.NewLine});
        lines = lines.Select(l=>l.Trim()).ToArray();
        string temp2 = string.Join(Environment.NewLine,lines);
        

        【讨论】:

          【解决方案5】:

          这会修剪每一行

          temp2 = string.Join(Environment.NewLine, 
              temp2.Split(new []{Environment.NewLine},StringSplitOptions.None)
                   .Select(l => l.Trim()));
          

          【讨论】:

          • 最终使用了您的代码,只是将最佳答案提供给其他用户,因为他包含了 Trim 不起作用的原因。不过谢谢。
          【解决方案6】:
          string temp3 = String.Join(
                              Environment.NewLine, 
                              temp2.Split(new char[] { '\n', '\r' },StringSplitOptions.RemoveEmptyEntries)
                                   .Select(s => s.Trim()));
          

          【讨论】:

          • 这里可能不适合删除空条目。这将删除额外的换行符...
          • @ReedCopsey 但也可能是 OP 想要的。谁知道
          • 删除多余的换行意味着字符串中间的全空行将被完全删除。我会大胆地声称这不太可能是任何人想要的...... :)
          【解决方案7】:

          我可以在多行字符串上使用 Trim/TrimStart/TrimEnd 吗?

          是的,但它只是将字符串作为一个整体进行修剪,而不关注字符串内容中的每一行。

          如果您需要修剪每一行,您可以执行以下操作:

          string trimmedByLine = string.Join(
                                       "\n", 
                                       temp2.Split('\n').Select(s => s.Trim()));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-16
            • 2022-01-01
            • 2019-03-03
            相关资源
            最近更新 更多