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

Jua*_*uan 7 .net c# io serialization deserialization

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

key1:value1
key2:value2
key3:value3
...
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Pet*_*e M 16

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

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

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


Kyl*_*ven 7

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

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

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


P.B*_*key 2

要求太模糊了。考虑:

“什么时候空格是值?键?”
“分隔符什么时候是值?键?”
“选项卡什么时候是值?键?”
“当在值的上下文中使用分隔符时,值在哪里结束?键”?

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

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

“{核心价值}”,

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

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

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