最可靠的分裂角色

时间:2009-12-10 09:40:00

标签: string

更新

如果你被迫在split方法上使用一个char,哪个char最可靠?

可靠的定义:一个拆分字符,它不是要拆分的各个子字符串的一部分。

11 个答案:

答案 0 :(得分:53)

我们目前使用

public const char Separator = ((char)007);

如果我没弄错的话,我认为这是哔声。

答案 1 :(得分:20)

除了可能不可用的0x0(例如,由于以空字符结尾的字符串),0x1和0x1f之间的ASCII控制字符是很好的候选者。 ASCII字符0x1c-0x1f甚至是为这样的东西而设计的,其名称为文件分隔符组分隔符记录分隔符单位分隔符。但是,它们被禁止使用XML等传输格式。

在这种情况下,可以使用unicode private use code points中的字符。

最后一个选择是使用转义策略,以便无论如何都可以以某种方式输入分隔字符。但是,这使任务变得非常复杂,你不能再使用String.Split了。

答案 2 :(得分:18)

如果你逃避字符串,你可以安全地使用你喜欢的任何字符作为分隔符,以便你知道它不包含那个字符。

让我们选择字符'a'作为分隔符。 (我故意挑选一个通常的角色来表明可以使用任何角色。)

使用字符'b'作为转义码。我们用“b1”替换任何出现的'a',用'b2'替换出'b':

private static string Escape(string s) {
   return s.Replace("b", "b2").Replace("a", "b1");
}

现在,该字符串不包含任何“a”字符,因此您可以将其中的几个字符串放在一起:

string msg = Escape("banana") + "a" + Escape("aardvark") + "a" + Escape("bark");

字符串现在看起来像这样:

b2b1nb1nb1ab1b1rdvb1rkab2b1rk

现在,您可以将字符串拆分为“a”并获取各个部分:

b2b1nb1nb1
b1b1rdvb1rk
b2b1rk

要解码部件,请向后执行替换:

private static string Unescape(string s) {
   return s.Replace("b1", "a").Replace("b2", "b");
}

因此拆分字符串并取消编码部分就像这样:

string[] parts = msg.split('a');
for (int i = 0; i < parts.length; i++) {
  parts[i] = Unescape(parts[i]);
}

或使用LINQ:

string[] parts = msg.Split('a').Select<string,string>(Unescape).ToArray();

如果选择较不常见的字符作为分隔符,则当然会减少将被转义的事件。关键是该方法确保该字符可以安全地用作分隔符,而不会对要放入字符串的数据中存在哪些字符进行任何假设。

答案 3 :(得分:8)

我通常更喜欢' | '符号作为拆分字符。如果您不确定用户在文本中输入了什么,那么您可以限制用户输入一些特殊字符,您可以从这些字符中选择分割字符。

答案 4 :(得分:6)

\ 0是一个很好的分裂角色。从键盘进入是非常困难(不可能?),这是合乎逻辑的。

\ n在某些情况下是另一个好的候选人。

当然,.Net字符串是unicode,不需要用前255个限制自己。你总是可以使用罕见的蒙古语字母或一些保留或未使用的Unicode符号。

答案 5 :(得分:6)

这取决于你分裂的内容。

在大多数情况下,最好使用相当常用的拆分字符,例如

  

价值,价值,价值

     

值|值|值

     

键=值;键=值;

     

键:值;密钥:值;

您可以使用逗号引用标识符:

  

“value”,“value”,“value with,inside”,“value”

我倾向于首先使用,,然后使用|,然后如果我不能使用其中任何一个,我会使用section-break char §

请注意,您可以使用ALT+number键入任何ASCII字符(仅限数字小键盘),因此§ALT+21

答案 6 :(得分:4)

String.Split有overloads个字符串分隔符......

答案 7 :(得分:2)

我个人说这完全取决于情况;如果你正在编写一个简单的TCP / IP聊天系统,你显然不应该使用'\ n'作为拆分..但'\ 0'是一个很好用的字符,因为用户不可能用它!

答案 8 :(得分:2)

首先,在C#(或.NET)中,您可以在一次拆分操作中使用多个拆分字符。

String.Split Method (Char[]) Reference here
用于分隔此实例中的子字符串的Unicode字符数组,不包含分隔符的空数组或null引用(在Visual Basic中为Nothing)。

在我看来,没有最可靠的分裂角色,但有些角色比其他角色更合适。

常用的分割字符,如制表符,逗号,管道,非常适合查看未分割的字符串/行。

如果仅用于存储/处理,则更安全的字符可能是那些很少使用的字符或者不容易从键盘输入的字符。

它还取决于使用情况。例如。如果您希望数据包含电子邮件地址,则“@”是否定号。

假设我们要从ASCII set中挑选一个。有很多可供选择。例如。 “`”,“^”和一些不可打印的字符。但要注意一些角色,并非所有角色都适合。例如。 0x00可能会对某些系统产生负面影响。

答案 9 :(得分:1)

这在很大程度上取决于它的使用环境。如果你在谈论一个非常笼统的分界角色,那么我认为没有一个通用的答案。

我发现ASCII空字符'\ 0'通常是一个很好的候选者,或者你可以使用nitzmahone的想法并使用多个字符,然后它就像你想要的一样疯狂。

或者,您可以解析输入并转义分隔符的任何实例。

答案 10 :(得分:0)

“|”当你将参数传递给只接受字符串类型参数的方法时,管道符号主要用于。 这在SQL Server SP中也被广泛使用,您需要将数组作为参数传递。好吧,这主要取决于你需要它的情况。