最可靠的分裂角色

JL.*_*JL. 48 string

更新

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

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

Adr*_*der 53

我们目前使用

public const char Separator = ((char)007);
Run Code Online (Sandbox Code Playgroud)

如果我没有记错的话,我想这就是哔哔声.

  • 这个名字叫Beep.控制台哔声.;) (9认同)
  • 将行写入控制台时应该很有趣:) (7认同)
  • ASCII名称是BEL. (6认同)
  • 所以我希望它永远不会出现在try和catch块的异常消息中? (3认同)
  • 我以为是"铃"而不是"嘟嘟"?无论如何,无论如何它听起来都会发出哔哔声:P (3认同)

nd.*_*nd. 20

除了可能不可用的0x0(例如,由于以空字符结尾的字符串),0x1和0x1f之间的ASCII控制字符是很好的候选者.ASCII字符0x1c-0x1f甚至是为这样的东西而设计的,其名称为File Separator,Group Separator,Record Separator,Unit Separator.但是,它们是以XML等传输格式禁止的.

在这种情况下,可以使用来自unicode专用代码点的字符.

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


Guf*_*ffa 19

如果你转义字符串,你可以安全地使用你喜欢的任何字符作为分隔符,这样你就知道它不包含那个字符.

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

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

private static string Escape(string s) {
   return s.Replace("b", "b2").Replace("a", "b1");
}
Run Code Online (Sandbox Code Playgroud)

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

string msg = Escape("banana") + "a" + Escape("aardvark") + "a" + Escape("bark");
Run Code Online (Sandbox Code Playgroud)

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

b2b1nb1nb1ab1b1rdvb1rkab2b1rk
Run Code Online (Sandbox Code Playgroud)

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

b2b1nb1nb1
b1b1rdvb1rk
b2b1rk
Run Code Online (Sandbox Code Playgroud)

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

private static string Unescape(string s) {
   return s.Replace("b1", "a").Replace("b2", "b");
}
Run Code Online (Sandbox Code Playgroud)

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

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

或者使用LINQ:

string[] parts = msg.Split('a').Select<string,string>(Unescape).ToArray();
Run Code Online (Sandbox Code Playgroud)

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

  • @JL:你错了.在转义字符串后,"点b21:b1n b1pple".取消它会给出原始字符串.我选择一个共同角色的原因是为了证明该方法是完全安全的.通常,您会选择较少使用的字符来最小化需要转义的字符数. (7认同)

rah*_*hul 8

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


yu_*_*sha 6

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

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

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


Kei*_*ith 6

这取决于你分裂的内容.

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

价值,价值,价值

值|值|值

键=值;键=值;

键:值;密钥:值;

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

"价值","价值","价值与内部","价值"

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

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