如何消除字符串中的所有换行符?

时间:2011-07-19 15:50:07

标签: c# .net string newline

我需要摆脱出现在我的字符串中的所有换行符(来自db)。 我使用以下代码执行此操作:

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

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

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

对于这样的问题,您是否有防弹方法?

编辑#1:

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

  1. 使用Regex.Replace
  2. 删除所有字符(如果是IsSeparator或IsControl
  3. 如果是IsWhiteSpace
  4. ,请替换为“”
  5. 创建所有可能行结尾的列表(“\ r \ n”,“\ r”,“\ n”,LF,VT,FF,CR,CR + LF,NEL,LS,PS)并且只需替换他们用空字符串。这是很多替代品。
  6. 我想说最好的结果将是在应用第一和第四种方法之后,但我无法确定哪种方法会更快。你认为哪一个是最完整的?

    EDIT#2

    我在下面张贴了。

12 个答案:

答案 0 :(得分:60)

以下是解决我的问题的扩展方法。 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);
}

答案 1 :(得分:22)

根据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

答案 2 :(得分:13)

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

答案 3 :(得分:9)

在这个问题上对约塞连的道具,我认为他是对的。用一个空格替换所有空格:

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

答案 4 :(得分:7)

我建议删除所有空格(char.IsWhitespace),并用单个空格替换它.IsWhiteSpace负责处理所有奇怪的unicode空格。

答案 5 :(得分:4)

你试过string.Replace(Environment.NewLine, "")吗?这对我来说通常会得到很多。

答案 6 :(得分:4)

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

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

答案 7 :(得分:1)

点击此链接: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\.@-]", ""); 
    }

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

我个人认为

    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();
    }

答案 10 :(得分:0)

如果你有一个字符串说“theString”那么  使用方法替换并给它如下所示的参数:

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

答案 11 :(得分:0)

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

  • 要从字符串中删除任何空格,请执行以下操作:s = Regex.Replace(s, @"\s+", "");\s匹配任何Unicode空格字符)
  • 要删除所有空白,但要删除CR和LF:s = Regex.Replace(s, @"[\s-[\r\n]]+", "");[\s-[\r\n]]是包含减法构造的字符类,它匹配除CR和LF之外的任何空白)
  • 要删除任何垂直空格,请从\p{Zs}\t中减去\s(除制表符之外的任何水平空格)和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