最可靠的分割字符
更新
如果你被迫在分割方法上使用单个字符,哪个字符将是最可靠的?
可靠性的定义:不是被拆分的单个子string的一部分的拆分字符。
我们目前使用
public const char Separator = ((char)007);
我想这是嘟嘟声,如果我没有弄错的话。
除了0x0(可能不可用)(例如由于以空字符结尾的string)之外,0x1和0x1f之间的ASCII控制字符是很好的select。 ASCII字符0x1c-0x1f甚至devise为这样的事情,并具有名称文件分隔符 , 组分隔符 , logging分隔符 , 单元分隔符 。 但是,它们在XML等传输格式中是被禁止的。
在这种情况下,可以使用来自unicode私用代码点的字符。
最后一个select是使用转义策略,以便分离字符可以以某种方式进入。 然而,这使得任务复杂化很多,你不能再使用String.Split了。
您可以安全地使用任何您喜欢的字符作为分隔符,如果您转义string,以便您知道它不包含该字符。
举个例子,select“a”作为分隔符。 (我故意select了一个通常的字符来表示可以使用任何字符。)
使用字符'b'作为转义码。 我们用'b1'replace'a'的出现,用'b2'replace出现的'b':
private static string Escape(string s) { return s.Replace("b", "b2").Replace("a", "b1"); }
现在,string不包含任何'a'字符,所以你可以把几个string放在一起:
string msg = Escape("banana") + "a" + Escape("aardvark") + "a" + Escape("bark");
string现在看起来像这样:
b2b1nb1nb1ab1b1rdvb1rkab2b1rk
现在,您可以将string拆分为“a”并获取单个部分:
b2b1nb1nb1 b1b1rdvb1rk b2b1rk
要解码的部分你做replace倒退:
private static string Unescape(string s) { return s.Replace("b1", "a").Replace("b2", "b"); }
因此,拆分string和解密部分是这样做的:
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();
如果您select一个不太常见的字符作为分隔符,那么当然会有更less的事件被转义。 重点是该方法确保该字符可以安全地用作分隔符,而不需要假定要放入string的数据中存在哪些字符。
我通常更喜欢“ |” '符号作为分割字符。 如果您不确定用户在文本中input的内容,则可以限制用户input一些特殊字符,您可以从这些字符中select分割字符。
这取决于你正在分裂。
在大多数情况下,最好使用相当常用的拆分字符
价值,价值,价值
值|值|值
键=值;键=值;
键:值;密钥:值;
你可以用逗号很好地使用带引号的标识符:
“价值”,“价值”,“价值与内部”,“价值”
我倾向于首先使用|
,那么如果我不能使用他们中的任何一个,我使用section-break char§
请注意,您可以使用ALT+number
(仅在数字小键盘上)键入任何ASCII字符,所以§
是ALT+21
\ 0是一个很好的分割字符。 从键盘input非常困难(不可能?),这是合乎逻辑的。
\ n在某些情况下是另一个好的候选人。
当然,.Netstring是unicode,不需要限制第一个255。你可以使用一个罕见的蒙古文字母或一些保留或未使用的Unicode符号。
有重载的String.Split采取string分隔符…
我个人认为完全取决于情况, 如果你正在编写一个简单的TCP / IP聊天系统,你显然不应该使用'\ n'作为分割。但是'\ 0'是一个很好的angular色,因为用户不能用它!
首先,在C#(或.NET)中,可以在一个拆分操作中使用多个拆分字符。
String.Split Method (Char[])
在这里引用
在此实例中分隔子string的Unicode字符数组,不包含分隔符的空数组或空引用(在Visual Basic中为Nothing)。
在我看来,没有MOST可靠的分割特性,但有些比其他更合适。
stream行的分割字符,如选项卡,逗号,pipe道查看未拆分的string/行是很好的。
如果仅用于存储/处理,则更安全的字符可能是那些很less使用的字符,或者是那些不容易从键盘input的字符。
它也取决于使用情况。 例如,如果您希望数据包含电子邮件地址,“@”是否是否定的。
假设我们从ASCII集中select一个。 有相当多的select。 例如“`”,“^”和一些不可打印的字符。 尽pipe提防某些人物,但并不都适合。 例如,0x00可能会对某些系统产生不利影响。
这很大程度上取决于它所使用的环境。 如果你正在谈论一个非常普遍的划界angular色,那么我不认为有一个万能的答案。
我发现ASCII空字符'\ 0'往往是一个很好的候选人,或者你可以用nitzmahone的想法,并使用多个字符,那么它可以是你想要的疯狂。
或者,您可以parsinginput并转义您的定界字符的任何实例。
“|” 当你传递参数的时候,pipe道符号主要是用来接受一个stringtypes参数的方法。 这在SQL Server SP中也被广泛使用,你需要传递一个数组作为参数。 那么主要取决于你需要的情况。