我遇到了问题,我想知道是否有任何智能解决方法。
我需要通过套接字将字符串传递给Web应用程序。这个字符串有三个部分,我使用'|'作为分隔符,将接收应用程序拆分为三个独立的部分。
问题在于'|' character可以是3个单独字符串中的任何一个字符,当发生这种情况时,整个分裂操作会扭曲字符串。
因此我的问题是: 有没有办法在某些文本中使用char / string作为分隔符,而这个char / string本身可能在文本中?
答案 0 :(得分:2)
一般模式是逃避分隔符。例如。什么时候'|'是分隔符,你可以使用“||”每当你在字符串中需要字符本身时(如果允许空字符串可能很难)或者你可以使用类似'\'之类的字符作为转义字符,以便'|'变成“\ |”而“\”本身就是“\\”
答案 1 :(得分:1)
有没有办法在某些文本中使用char / string作为分隔符 这个char / string本身可能在文本中吗?
简单回答:否。
当然,当字符串/分隔符完全相同时,不对文本进行修改。
当然有可能的解决方法。一种可能的解决方案是您可能希望在分隔符之间具有最小/固定宽度,但这并不完美。
另一种可能的解决方案是选择一个永远不会在文本中出现的分隔符(字符序列)。这需要您更改源和使用者。
当我需要使用分隔符时,我通常选择一个分隔符,我99.9%肯定在正常文本中不会出现分隔符,分隔符可能会根据我期望的文本类型而有所不同。
以下是Wikipedia的引用:
因为分隔符碰撞是一个非常常见的问题,各种方法 为了避免它已被发明。有些作者可能会试图避免 通过选择分隔符(或序列)来解决问题 字符)不太可能出现在数据流本身。 这种临时方法可能是合适的,但它必然取决于a 正确猜测数据流中会出现什么,并提供不 防止恶意冲突的安全性。其他更正式的公约 因此也适用。
只是对您的用例的旁注,为什么不使用协议来发送数据?例如protobuf?
答案 2 :(得分:1)
这里的问题是给出以下字符串:
string toParse = "What|do you|want|to|say|?";
它可以通过多种方式解析:
“什么
你呢
想|至|说|?“
或
“你怎么样?
要
至|说|?“
依旧......
你可以定义规则来解析你的字符串,但是对它进行编码会很困难,而且对最终用户来说这似乎是直截了当的。
字符串必须包含一个转义字符,表示符号“|”是想要的,而不是分隔符。 这可以是例如“\ |”。
这是一个使用正则表达式的完整示例:
using System.Text.RegularExpressions;
//... Put this in the main method of a Console Application for instance.
// The '@' character before the strings are to specify "raw" strings, where escape characters '\' are not escaped
Regex reg = new Regex(@"^((?<string1>([^\|]|\\\|)+)\|)((?<string2>([^\|]|\\\|)+)\|)(?<string3>([^\|]|\\\|)+)$");
string toTest = @"user\|dureuill|deserves|an\|upvote";
MatchCollection matches = reg.Matches(toTest);
if (matches.Count != 1)
{
throw new FormatException("Bad formatted pattern.");
}
Match match = matches[0];
string string1 = match.Groups["string1"].Value.Replace(@"\|", "|");
string string2 = match.Groups["string2"].Value.Replace(@"\|", "|");
string string3 = match.Groups["string3"].Value.Replace(@"\|", "|");
Console.WriteLine(string1);
Console.WriteLine(string2);
Console.WriteLine(string3);
Console.ReadKey();
答案 3 :(得分:0)
首先对HTMLEncode和HTMLDecode你的字符串有用,然后将它们与你的分隔符一起附加。
答案 4 :(得分:0)
我认为你要么
1)找到一个永远不会出现在字符串
中的字符或字符集或
2)使用固定长度的琴弦和打击垫。
答案 5 :(得分:0)
如果您可以灵活地执行此操作,可能会调整分隔符?因此,字符串可以读取“String1”|“String2”而不是String1 | String2。
如果管道是不需要的 - 在创建/输入此字符串期间进行一些简单的验证?
答案 6 :(得分:0)
您可以找到消息部分中不存在的分隔符,并在发送消息的开头传递分隔符,而不是使用|
作为分隔符。这是一个使用整数作为分隔符的示例:
String[] parts = {"this is a message", "it's got three parts", "this one's the last"};
String delimiter = null;
for (int i = 0; i < 100; i++) {
String s = Integer.toString(i);
if (parts[0].contains(s) || parts[1].contains(s) || parts[2].contains(s))
continue;
delimiter = s;
break;
}
String message = delimiter + "#" + parts[0] + delimiter + parts[1] + delimiter + parts[2];
现在消息为0#this is a message0it's got three parts0this one's the last
。
在接收端,您首先找到分隔符并将消息字符串拆分为:
String[] tmp = message.split("#", 2);
String[] parts = tmp[1].split(tmp[0]);
这不是最有效的解决方案,因为它需要多次扫描消息部分,但它很容易实现。如果您没有找到delimiter
的值且null
恰好是邮件的一部分,则可能会遇到意外结果。