从字符串中删除所有“隐形”字符?

我正在编写一个小类来读取文件中的键值对列表并写入Dictionary 。 此文件将具有以下格式:

 key1:value1 key2:value2 key3:value3 ... 

这应该很容易,但是由于用户要手动编辑这个文件,我应该如何处理空格,标签,额外的线条跳转等等? 我可以使用Replace删除空格和制表符,但是,是否还有其他“隐形”字符我缺少?

或者我可以删除所有不是字母数字的字符,“:”和行跳转(因为行跳转是将一对与另一对分开),然后删除所有额外的行跳转。 如果是这样,我不知道如何删除“all-except-some”字符。

当然我也可以查看“key1:value1:somethingelse”之类的错误。 但是这样的事情并不重要,因为它显然是用户的错,我只会显示“无效格式”消息。 我只是想处理基本的东西,然后将所有这些放在try / catch块中以防万一出错。

注意:我根本不需要任何空格,即使在键或值内也是如此。

要求太模糊了。 考虑:

“什么时候空间是一个价值?关键?”
“分隔符什么时候是值?键?”
“标签何时是值?键?”
“当在值?键的上下文中使用分隔符时,值何处结束”?

这些问题将导致代码填写一次性和糟糕的用户体验。 这就是我们有语言规则/语法的原因。

定义一个简单的语法并消除大部分的猜测。

“{核心价值}”,

在这里,您有一个键/值对包含在引号内,并通过分隔符(,)分隔。 所有无关的字符都可以忽略。 您可以使用XML,但这可能会吓跑不太熟练的用户。

注意,引号是任意的。 随意替换任何不需要太多转移的集合容器(只要注意复杂性)。

就个人而言,我会将其包装在一个简单的UI中,并将数据序列化为XML。 有时候不这样做,但你没有给我任何理由。

我最近做了这个,当我终于因为太多无证的垃圾而生气时,形成了一个糟糕的xml。 它有效地修剪掉了空间和ASCII表中〜之间的任何内容:

 static public string StripControlChars(this string s) { return Regex.Replace(s, @"[^\x20-\x7F]", ""); } 

结合已发布的其他RegEx示例,它可以让您到达目的地。

如果您使用正则表达式(正则表达式),您可以使用一个函数过滤掉所有这些。

string newVariable Regex.Replace(variable,@“\ s”,“”);

这将删除空格,隐形字符,\ n和\ r。

 var split = textLine.Split(":").Select(s => s.Trim()).ToArray(); 

Trim()函数将删除所有不相关的空格。 请注意,这会保留键或值内的空格,您可能需要单独考虑。

经常咬我们的“白色”空间之一是不易碎的空间。 此外,我们的系统必须与更具限制性的MS-Dynamics兼容。 首先,我创建了一个函数,将第8位字符映射到它们的大约第7位对应字符,然后我删除了不受x20到x7f范围内任何进一步受Dynamics接口限制的范围。

 Regex.Replace(s, @"[^\x20-\x7F]", "") 

应该做那个工作。

您可以使用string.Trim()删除空格字符:

 var results = lines .Select(line => { var pair = line.Split(new[] {':'}, 2); return new { Key = pair[0].Trim(), Value = pair[1].Trim(), }; }).ToList(); 

但是,如果要删除所有空格,可以使用正则表达式:

 var whiteSpaceRegex = new Regex(@"\s+", RegexOptions.Compiled); var results = lines .Select(line => { var pair = line.Split(new[] {':'}, 2); return new { Key = whiteSpaceRegex.Replace(pair[0], string.Empty), Value = whiteSpaceRegex.Replace(pair[1], string.Empty), }; }).ToList(); 

如果它不必很快,你可以使用LINQ:

 string clean = new String(tainted.Where(c => 0 <= "ABCDabcd1234:\r\n".IndexOf(c)).ToArray());