我需要摆脱出现在我的字符串中的所有换行符(来自db)。 我使用以下代码执行此操作:
value.Replace("\r\n", "").Replace("\n", "").Replace("\r", "")
我可以看到,至少有一个角色表现得像行结束,幸存下来。字符代码为8232。
这对我来说非常蹩脚,但我必须说这是我第一次有幸看到这个角色。很明显,我可以直接替换这个字符,但我正在考虑将我当前的方法(基于替换“\ r”和“\ n”的组合)扩展到更加可靠的东西,因此它不仅包括' 8232'char,还有其他所有人都没有找到我。
对于这样的问题,您是否有防弹方法?
编辑#1:
在我看来,有几种可能的解决方案:
我想说最好的结果将是在应用第一和第四种方法之后,但我无法确定哪种方法会更快。你认为哪一个是最完整的?
EDIT#2
我在下面张贴了。
答案 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空格字符)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。