【问题标题】:How to eliminate ALL line breaks in string?如何消除字符串中的所有换行符?
【发布时间】:2011-10-08 16:06:39
【问题描述】:

我需要删除字符串中出现的所有换行符(来自 db)。 我使用下面的代码:

value.Replace("\r\n", "").Replace("\n", "").Replace("\r", "")

我可以看到至少有一个角色表现得像行尾一样幸存下来。字符代码为8232

我很蹩脚,但我必须说这是我第一次有幸看到这个字符。很明显,我可以直接替换这个字符,但我正在考虑将我目前的方法(基于替换“\r”和“\n”的组合)扩展到更可靠的东西,所以它不仅包括 ' 8232' char 以及所有其他我还没有找到的字符。

对于这样的问题,你有没有万全之策?

编辑#1:

在我看来有几种可能的解决方案:

  1. 使用 Regex.Replace
  2. 如果是 IsSeparator 或 IsControl,则删除所有字符
  3. 如果是 IsWhiteSpace,则替换为“”
  4. 创建所有可能的行尾(“\r\n”、“\r”、“\n”、LF、VT、FF、CR、CR+LF、NEL、LS、PS)的列表,然后替换他们用空字符串。有很多替代品。

我会说最好的结果将是在应用第 1 种和第 4 种方法之后,但我无法决定哪种方法会更快。你觉得哪一个最完整?

编辑#2

我在下面发布了答案。

【问题讨论】:

  • 不管怎样,你遇到的角色是 U+2028,'LINE SEPARATOR'。 fileformat.info/info/unicode/char/2028/index.htm
  • 我已经删除了我的答案,但是以下内容呢:stackoverflow.com/questions/238002/…
  • 它只是询问换行符,而不是它们的特殊情况。在这个老问题的上下文中,答案是正确的,因为OP显然不关心这种特殊情况,否则他会提到它们。
  • 感谢您的解释,我从未在不到 1 分钟内得到 -3。有徽章吗? :-)))

标签: c# .net string newline


【解决方案1】:

以下是解决我的问题的扩展方法。 LineSeparator 和 ParagraphEnding 当然可以在其他地方定义,如静态值等。

public static string RemoveLineEndings(this string value)
{
    if(String.IsNullOrEmpty(value))
    {
        return value;
    }
    string lineSeparator = ((char) 0x2028).ToString();
    string paragraphSeparator = ((char)0x2029).ToString();

    return value.Replace("\r\n", string.Empty)
                .Replace("\n", string.Empty)
                .Replace("\r", string.Empty)
                .Replace(lineSeparator, string.Empty)
                .Replace(paragraphSeparator, string.Empty);
}

【讨论】:

  • 这仅错过了我的字符串中的一个违规字符:\f Formfeed
  • 我用它成功解决了csv文件创建过程中的问题。其中的一些字符串带有行分隔符,这是行排列不正确的原因。通过上面的代码,我解决了问题。
  • 这很棒。谢谢+1
【解决方案2】:

根据wikipedia,您可能需要处理许多行终止符(包括您提到的这个)。

LF:换行,U+000A
VT:垂直制表符,U+000B
FF:换页,U+000C
CR:回车,U+000D
CR+LF:CR (U+000D) 后跟 LF (U+000A)
NEL:下一行,U+0085
LS:行分隔符,U+2028
PS:段落分隔符,U+2029

【讨论】:

  • 正则表达式形式:Regex.Replace(str, @"[\u000A\u000B\u000C\u000D\u2028\u2029\u0085]+", String.Empty)
【解决方案3】:

8232 (0x2028) 和 8233 (0x2029) 是您可能想要消除的唯一其他两个。请参阅char.IsSeparator 的文档。

【讨论】:

  • 嗯,不——“已经在语言中实现”的东西实际上并不能解决最初的问题。阅读 char.IsSeparator 的文档——它不会为“正常”换行符返回 true,因为 Unicode 将它们归类为“控制字符”。
  • @Joe - 是的,但我向 OP 展示了他想要摆脱的字符点的官方列表,它在文档中。
  • 我认为他只是为了查看文档,而不是实际使用char.IsSeparator
【解决方案4】:

在这个问题上给 Yossarian 的建议,我认为他是对的。用一个空格替换所有空格:

data = Regex.Replace(data, @"\s+", " ");

【讨论】:

  • 呃……那不是到处插入空格吗?因为它不仅匹配所有空格,它还匹配空字符串。您应该改用"\s+"
  • 是的,"\s*" 将匹配每个字符,并在每个字符后插入一个空格。如果您正在为 1995 年编写一个漂亮的 Geocities 网站,那就太好了!
【解决方案5】:

我建议删除所有空格 (char.IsWhitespace),并将其替换为单个空格。IsWhiteSpace 会处理所有奇怪的 unicode 空格。

【讨论】:

    【解决方案6】:

    这是我第一次尝试,但我认为这会做你想要的......

    var controlChars = from c in value.ToCharArray() where Char.IsControl(c) select c;
    foreach (char c in controlChars)  
       value = value.Replace(c.ToString(), "");
    

    此外,有关您可以使用的其他方法的详细信息,请参阅此链接:Char Methods

    【讨论】:

    • 略短:value = new string(value.Where(c => !char.IsControl(c)).ToArray())
    【解决方案7】:

    你试过string.Replace(Environment.NewLine, "") 吗?这通常会为我带来很多。

    【讨论】:

    • 我在这里某处读到它并不涵盖所有情况。
    • 绝对不能涵盖所有情况,只是测试了一下。
    【解决方案8】:

    查看此链接:http://msdn.microsoft.com/en-us/library/844skk0h.aspx

    您将不得不尝试并构建一个适合您的 REGEX 表达式。但这是骨架……

    static void Main(string[] args)
    {
    
            StringBuilder txt = new StringBuilder();
            txt.Append("Hello \n\n\r\t\t");
            txt.Append( Convert.ToChar(8232));
    
            System.Console.WriteLine("Original: <" + txt.ToString() + ">");
    
            System.Console.WriteLine("Cleaned: <" + CleanInput(txt.ToString()) + ">");
    
            System.Console.Read();
    
        }
    
        static string CleanInput(string strIn)
        {
            // Replace invalid characters with empty strings.
            return Regex.Replace(strIn, @"[^\w\.@-]", ""); 
        }
    

    【讨论】:

    • 我已经尝试了所有其他解决方案,最后这是唯一适合我的解决方案:Regex.Replace(strIn, @"[^\w\.@-]", "" ),谢谢@BBC
    【解决方案9】:

    假设 8232 是 unicode,你可以这样做:

    value.Replace("\u2028", string.Empty);
    

    【讨论】:

      【解决方案10】:

      我个人会选择

          public static String RemoveLineEndings(this String text)
          {
              StringBuilder newText = new StringBuilder();
              for (int i = 0; i < text.Length; i++)
              {
                  if (!char.IsControl(text, i))
                      newText.Append(text[i]);
              }
              return newText.ToString();
          }
      

      【讨论】:

        【解决方案11】:

        如果你有一个字符串说“theString”然后 使用方法 Replace 并为其提供如下所示的参数:

        theString = theString.Replace(System.Environment.NewLine, "");

        【讨论】:

          【解决方案12】:

          以下是一些使用 .NET 正则表达式的快速解决方案:

          • 要从字符串中删除任何空格:s = Regex.Replace(s, @"\s+", "");\s 匹配任何 Unicode 空格字符)
          • 要删除除 CR 和 LF 之外的所有空格:s = Regex.Replace(s, @"[\s-[\r\n]]+", "");[\s-[\r\n]] 是一个包含减法构造的字符类,它匹配除 CR 和 LF 之外的任何空格)
          • 要删除任何垂直空格,请从\s 中减去\p{Zs}(除制表符之外的任何水平空格)和\t(制表符):s = Regex.Replace(s, @"[\s-[\p{Zs}\t]]+", "");

          将最后一个包装成扩展方法:

          public static string RemoveLineEndings(this string value)
          {
              return Regex.Replace(value, @"[\s-[\p{Zs}\t]]+", "");
          }
          

          请参阅regex demo

          【讨论】:

            猜你喜欢
            • 2012-06-04
            • 2012-10-29
            • 2019-09-28
            • 2011-11-30
            • 2016-11-13
            • 2011-08-27
            相关资源
            最近更新 更多