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

本文关键字:换行符 何消 字符串 | 更新日期: 2023-09-27 18:02:44

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

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

我可以看到,至少有一个字符的行为像行结束幸存下来。字符码为8232。

我真笨,但我必须说,这是我第一次很高兴见到这个人物。很明显,我可以直接替换这个字符,但我正在考虑扩展我目前的方法(基于替换"'r"answers"'n"的组合)到更坚实的东西,所以它不仅包括'8232'字符,还包括所有其他未被我找到的字符。 对于这样的问题,你有一个万无一失的方法吗?编辑# 1:

在我看来,有几种可能的解决办法:

  1. 使用正则表达式。替换
  2. 删除IsSeparator或IsControl
  3. 中的所有字符
  4. 如果是IsWhiteSpace
  5. 用" "代替
  6. 创建一个包含所有可能的行结尾的列表("'r'n","'r","'n",LF,VT, FF, CR, CR+LF, NEL, LS, PS),并将它们替换为空字符串。有很多替代品。

我想说最好的结果将是在应用第一和第四种方法之后,但我不能决定哪种方法更快。你认为哪一个是最完整的?

编辑# 2

我在下面贴了答案

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

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

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

LF:换行,U+000A
VT:垂直标签,U+000B
FF: Form Feed, U+000C
CR:回车,U+000D
CR+LF: CR (U+000D)后接LF (U+000A)
NEL:下一行,U+0085
LS: Line Separator, U+2028
PS:段落分隔符,U+2029

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

在这一点上,我认为Yossarian是对的。用一个空格替换所有空白:

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

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

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

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

您试过string.Replace(Environment.NewLine, "")吗?这通常会让我得到很多。

查看此链接: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'.@-]", ""); 
    }

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

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

我个人会选择

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

如果你有一个字符串,说"theString"然后使用Replace方法并给它如下所示的参数:

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

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

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

将最后一个封装到扩展方法中:

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