字符串-最可靠的分割通道

更新资料

如果您被迫在拆分方法上使用单个字符,那么哪个字符最可靠?

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

JL. asked 2020-02-18T01:59:41Z
11个解决方案
53 votes

我们目前使用

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

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

Adriaan Stander answered 2020-02-18T01:59:53Z
20 votes

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

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

最后一种选择是使用转义策略,以便无论如何都可以输入分隔字符。 但是,这使任务复杂化了很多,您不能再使用String.Split了。

nd. answered 2020-02-18T02:00:23Z
19 votes

如果对字符串进行转义,则可以放心地使用任何喜欢的字符作为定界符,以便知道它不包含该字符。

例如,让我们选择字符“ a”作为分隔符。 (我特意选择了一个常用字符来表示可以使用任何字符。)

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

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();

如果您选择一个不太常见的字符作为分隔符,那么自然会转义的事件更少。 关键是该方法可确保将字符安全地用作定界符,而无需对要放入字符串中的数据中存在哪些字符做任何假设。

Guffa answered 2020-02-18T02:01:24Z
8 votes

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

rahul answered 2020-02-18T02:01:44Z
6 votes

这取决于您要拆分的内容。

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

价值,价值,价值

值|值|值

键=值;键=值;

键:值;键:值;

您可以在引号中很好地使用带引号的标识符:

“值”,“值”,“带有,内部”,“值”的值

我倾向于先使用ALT+number,然后再使用§,然后如果我不能使用它们中的任何一个,我会使用分节符char ALT+21

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

Keith answered 2020-02-18T02:02:43Z
6 votes

\ 0是一个很好的拆分字符。 从键盘输入很难(不可能吗?),这是合乎逻辑的。

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

当然,.Net字符串是unicode,无需将自己限制为前255个。您始终可以使用稀有的蒙古字母或某些保留或未使用的Unicode符号。

yu_sha answered 2020-02-18T02:03:12Z
4 votes

String.Split的重载采用字符串分隔符...

nitzmahone answered 2020-02-18T02:03:33Z
2 votes

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

Siyfion answered 2020-02-18T02:03:53Z
2 votes

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

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

我认为,没有MOST可靠的拆分字符,但是有些比其他更合适。

常用的拆分字符(如制表符,逗号,竖线)非常适合查看未拆分的字符串/行。

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

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

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

o.k.w answered 2020-02-18T02:04:45Z
1 votes

它在很大程度上取决于使用它的上下文。 如果您谈论的是一个非常笼统的定界字符,那么我认为没有一个千篇一律的答案。

我发现ASCII空字符“ \ 0”通常是一个不错的选择,或者您也可以按照尼兹马哈内的想法使用多个字符,然后就可以根据需要随意设置。

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

Quick Joe Smith answered 2020-02-18T02:05:14Z
0 votes

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

Sumeet answered 2020-02-18T02:05:35Z
translate from https://stackoverflow.com:/questions/1879860/most-reliable-split-character