String 最可靠的分割字符
更新 如果您被迫在拆分方法中使用单个字符,那么哪个字符最可靠String 最可靠的分割字符,string,String,更新 如果您被迫在拆分方法中使用单个字符,那么哪个字符最可靠 可靠的定义:一个分割字符,它不是被分割的单个子字符串的一部分 有许多使用字符串分隔符的字符串.Split…我通常喜欢使用“|”符号作为拆分字符。如果您不确定用户在文本中输入的内容,则可以限制用户输入某些特殊字符,您可以从这些字符中选择拆分字符。这在很大程度上取决于使用该字符的上下文。如果你说的是一个非常普遍的划界字符,那么我不认为有一个一刀切的答案 我发现ASCII空字符“\0”通常是一个很好的候选者,或者你可以按照nitzmahon
可靠的定义:一个分割字符,它不是被分割的单个子字符串的一部分 有许多使用字符串分隔符的字符串.Split…我通常喜欢使用“|”符号作为拆分字符。如果您不确定用户在文本中输入的内容,则可以限制用户输入某些特殊字符,您可以从这些字符中选择拆分字符。这在很大程度上取决于使用该字符的上下文。如果你说的是一个非常普遍的划界字符,那么我不认为有一个一刀切的答案 我发现ASCII空字符“\0”通常是一个很好的候选者,或者你可以按照nitzmahone的想法使用多个字符,然后它可以像你想的那样疯狂
或者,您可以解析输入并转义定界字符的任何实例。\0是一个很好的分割字符。从键盘输入很难(不可能?),这是合乎逻辑的 \在某些情况下,n是另一个很好的候选者 当然,.Net字符串是unicode的,不需要限制前255个字符。您可以始终使用罕见的蒙古语字母或某些保留或未使用的Unicode符号。我们目前使用
public const char Separator = ((char)007);
如果我没有弄错的话,我想这是嘟嘟声。我个人认为这完全取决于情况;如果您正在编写一个简单的TCP/IP聊天系统,显然不应该使用“\n”作为拆分。。但是“\0”是一个很好的字符,因为用户永远不能使用它 这取决于您要拆分的内容 例如,在大多数情况下,最好使用非常常用的拆分字符 价值,价值,价值 值|值|值 键=值;键=值 关键词:价值;关键词:价值 您可以很好地使用带引号的标识符和逗号: “值”、“值”、“带值、内值”、“值” 我倾向于先使用
,
,然后再使用|
,如果两者都不能使用,我就使用分节符§
请注意,您可以使用
ALT+number
(仅在数字键盘上)键入任何ASCII字符,因此§
是ALT+21
,除了0x0之外,0x0可能不可用(例如,由于以空结尾的字符串),0x1和0x1f之间的ASCII控制字符是很好的候选字符。ASCII字符0x1c-0x1f甚至是为这种情况而设计的,它们的名称有文件分隔符、组分隔符、记录分隔符和单元分隔符。但是,它们在运输格式中是被禁止的,例如
在这种情况下,可以使用来自的字符
最后一个选项是使用转义策略,以便无论如何都可以输入分隔字符。但是,这会使任务变得非常复杂,您不能再使用String.Split。首先,在C#(或.NET)中,您可以在一次拆分操作中使用多个拆分字符
String.Split方法(Char[])
在此实例中分隔子字符串的Unicode字符数组、不包含分隔符的空数组或空引用(在Visual Basic中为空) 在我看来,没有最可靠的分割字符,但是有些比其他更合适 常用的拆分字符(如制表符、逗号、管道)有助于查看未拆分的字符串/行 如果仅用于存储/处理,则更安全的字符可能是那些很少使用或不容易从键盘输入的字符 它还取决于使用上下文。例如,如果您希望数据包含电子邮件地址,“@”表示否 假设我们要从中挑选一个。有很多可供选择。例如“`”、“^”和一些不可打印的字符。不过要注意一些角色,并非所有角色都适合。例如,0x00可能会对某些系统产生不利影响。“|”管道符号主要用于传递参数。。只接受字符串类型参数的方法。
这在SQL Server SP中也广泛使用,您需要将数组作为参数传递。大部分情况下,它取决于您需要它的位置。您可以安全地使用您喜欢的任何字符作为分隔符,如果您转义字符串以便知道它不包含该字符 例如,让我们选择字符“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
string[] parts = msg.split('a');
for (int i = 0; i < parts.length; i++) {
parts[i] = Unescape(parts[i]);
}
现在,您可以拆分“a”上的字符串并获得各个部分:
b2b1nb1nb1
b1b1rdvb1rk
b2b1rk
要解码零件,请反向执行更换:
private static string Unescape(string s) {
return s.Replace("b1", "a").Replace("b2", "b");
}
因此,拆分字符串并取消部分编码的操作如下:
b2b1nb1nb1ab1b1rdvb1rkab2b1rk
string[] parts = msg.split('a');
for (int i = 0; i < parts.length; i++) {
parts[i] = Unescape(parts[i]);
}
string[]parts=msg.split('a');
对于(int i=0;i
或使用LINQ:
string[] parts = msg.Split('a').Select<string,string>(Unescape).ToArray();
string[]parts=msg.Split('a').Select(Unescape.ToArray();
如果您选择一个不太常见的字符作为分隔符,那么将转义的出现次数当然会减少。关键是,该方法确保可以安全地将字符用作分隔符,而无需假设数据中存在哪些字符要放入字符串。它是否会最终出现在ex.message文本中?取决于引发异常的人\n实际上可能发生。但是你可以使用一些罕见的Unicode字符!所以我想希望它永远不会出现在try-and-catch块的异常消息中?不确定这是否是最好的答案,但它是最正确的答案