如何消除字符串中的所有换行符
本文关键字:换行符 何消 字符串 | 更新日期: 2023-09-27 18:02:44
我需要摆脱所有出现在我的字符串(来自db)的换行符。我使用下面的代码:
value.Replace("'r'n", "").Replace("'n", "").Replace("'r", "")
我可以看到,至少有一个字符的行为像行结束幸存下来。字符码为8232。
我真笨,但我必须说,这是我第一次很高兴见到这个人物。很明显,我可以直接替换这个字符,但我正在考虑扩展我目前的方法(基于替换"'r"answers"'n"的组合)到更坚实的东西,所以它不仅包括'8232'字符,还包括所有其他未被我找到的字符。 对于这样的问题,你有一个万无一失的方法吗?编辑# 1:在我看来,有几种可能的解决办法:
- 使用正则表达式。替换
- 删除IsSeparator或IsControl 中的所有字符
- 如果是IsWhiteSpace 用" "代替
- 创建一个包含所有可能的行结尾的列表("'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]]+", "");
}