【问题标题】:How to remove new line characters from a string?如何从字符串中删除换行符?
【发布时间】:2010-11-10 02:32:21
【问题描述】:

我有一个格式如下的字符串

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'

我想从上面的字符串中删除所有出现的\n\r

我尝试过string s = s.Trim(new char[] {'\n', '\r'});,但没有帮助。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    我喜欢使用正则表达式。在这种情况下,您可以这样做:

    string replacement = Regex.Replace(s, @"\t|\n|\r", "");
    

    正则表达式在 .NET 世界中不像在动态语言中那样流行,但它们提供了强大的字符串操作能力。

    【讨论】:

    • 这对我来说绝对是最好的解决方案。这个 C# 和 javascript 的平滑混合就是我解决问题所需要的。
    • 我遇到了类似的问题,我还需要从字符串中删除换行符。我试着用 string.Replace 来做,没有用。当我使用与参数完全相同的正则表达式字符串的 Regex.Replace 时,它​​起作用了。谢谢。
    • 如果在处理 1M+ 个项目的循环中使用它时要小心。正则表达式比 String.Replace 慢得多
    • 该代码示例还删除了标签\t,这是没有问题的。
    【解决方案2】:

    您想使用String.Replace 删除一个字符。

    s = s.Replace("\n", String.Empty);
    s = s.Replace("\r", String.Empty);
    s = s.Replace("\t", String.Empty);
    

    请注意,String.Trim(params char[] trimChars) 仅从调用的实例中删除 trimChars 中的前导和尾随字符。

    你可以做一个扩展方法,这样可以避免上面做很多临时字符串的性能问题:

    static string RemoveChars(this string s, params char[] removeChars) {
        Contract.Requires<ArgumentNullException>(s != null);
        Contract.Requires<ArgumentNullException>(removeChars != null);
        var sb = new StringBuilder(s.Length);
        foreach(char c in s) { 
            if(!removeChars.Contains(c)) {
                sb.Append(c);
            }
        }
        return sb.ToString();
    }
    

    【讨论】:

    • 请注意,这种方法将创建两个中间字符串对象。根据字符串的大小,这可能会对性能和内存消耗产生重大影响。
    【解决方案3】:

    我知道这是一篇旧帖子,但我想我会分享我用来删除换行符的方法。

    s.Replace(Environment.NewLine, "");
    

    参考文献:

    MSDN String.Replace MethodMSDN Environment.NewLine Property

    【讨论】:

    • 非常适合 Mono 支持
    • 在跨环境(即从 Unix 系统提供数据的 Windows 应用程序)应用程序中,这将导致比利润更多的问题。
    【解决方案4】:

    如果速度和低内存使用很重要,请执行以下操作:

    var sb = new StringBuilder(s.Length);
    
    foreach (char i in s)
        if (i != '\n' && i != '\r' && i != '\t')
            sb.Append(i);
    
    s = sb.ToString();
    

    【讨论】:

    • 是的,我也会这样做(在扩展方法中)。使用 StringBuilder 总是很好。 +1
    • “使用 StringBuilder 总是很好” article by Jeff Atwood 提供了对字符串操作/连接以及最终优化的有趣见解。
    【解决方案5】:

    就这样吧

    s = s.Replace("\n", String.Empty).Replace("\t", String.Empty).Replace("\r", String.Empty);
    

    【讨论】:

      【解决方案6】:

      一种 LINQ 方法:

      string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'";
      
      string s1 = String.Join("", s.Where(c => c != '\n' && c != '\r' && c != '\t'));
      

      【讨论】:

      • 这是使用string.Join 的通用重载,它将在查询返回的每个char 上调用ToString。最好将查询结果传递给string 构造函数。 s1 = new string(s.Where(....).ToArrary());
      【解决方案7】:

      正确的选择实际上取决于输入字符串的大小以及性能和内存要求是什么,但我会使用像

      这样的正则表达式
      string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty);
      

      或者如果我们需要多次应用相同的替换,最好使用正则表达式的编译版本

      var regex = new Regex(@"\r\n?|\n|\t", RegexOptions.Compiled); 
      string result = regex.Replace(s, String.Empty);
      

      注意:不同的场景需要不同的方法来实现最佳性能和最小内存消耗

      【讨论】:

        【解决方案8】:

        嗯...我希望您了解更具体的空间领域。 \t 实际上被分类为水平空间,而不是垂直空间。 (测试在记事本中插入\t

        如果您使用 Java,只需使用 \v。请参阅下面的参考资料。

        \h - 水平空白字符:

        [\t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

        \v - 垂直空白字符:

        [\n\x0B\f\r\x85\u2028\u2029]

        但我知道您使用的是 .NET。所以我替换每个垂直空间的答案是..

        string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");
        

        【讨论】:

        • 它看起来像是对其他问题的回答......并且还缺少实际参考......
        【解决方案9】:
        string remove = Regex.Replace(txtsp.Value).ToUpper(), @"\t|\n|\r", "");
        

        【讨论】:

        【解决方案10】:

        如果你想从开始和结束中删除,你可以使用Trim

        string stringWithoutNewLine = "\n\nHello\n\n".Trim();
        

        【讨论】:

          【解决方案11】:

          仅供参考,

          Trim() 已经这样做了。

          以下 LINQPad 示例:

          void Main()
          {
              var s = " \rsdsdsdsd\nsadasdasd\r\n ";
              s.Length.Dump();
              s.Trim().Length.Dump();
          }
          

          输出:

          23
          18
          

          【讨论】:

          • 这并没有删除中间的\n。
          猜你喜欢
          • 1970-01-01
          • 2012-06-01
          • 2016-04-14
          • 2011-10-13
          • 1970-01-01
          • 1970-01-01
          • 2014-05-12
          • 2012-06-04
          相关资源
          最近更新 更多