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

时间:2011-03-14 19:13:49

标签: c# .net serialization io deserialization

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

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

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

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

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

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

7 个答案:

答案 0 :(得分:16)

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

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

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:4)

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

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

应该做那件事。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

您可以使用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();

答案 5 :(得分:2)

要求太模糊了。考虑:

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

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

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

“{}键”: “{}值”,

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

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

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

答案 6 :(得分:0)

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

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