使用字符串中存在的分隔符拆分字符串

时间:2012-09-12 08:38:24

标签: c# java

我遇到了问题,我想知道是否有任何智能解决方法。

我需要通过套接字将字符串传递给Web应用程序。这个字符串有三个部分,我使用'|'作为分隔符,将接收应用程序拆分为三个独立的部分。

问题在于'|' character可以是3个单独字符串中的任何一个字符,当发生这种情况时,整个分裂操作会扭曲字符串。

因此我的问题是: 有没有办法在某些文本中使用char / string作为分隔符,而这个char / string本身可能在文本中?

7 个答案:

答案 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恰好是邮件的一部分,则可能会遇到意外结果。