如何解析包含与定界符相同符号的字符串?

时间:2019-02-22 13:57:01

标签: java string parsing split delimiter

我想将一些字符串放在一起,然后再将它们分开。我想用作将字符串放在一起的点的标记的字符也应该允许出现在字符串中。

示例:
我们想发送消息给其他人。不仅应该有消息本身,还应该有一些有关发送者和接收者的信息。

因此,我们有三个字符串:发送者,接收者和文本。作为定界符,我使用$。这意味着合并的String将具有以下语法:sender $ receiver $ text

只要发件人,收件人或文本中没有$,一切都很好,并且再次拆分String时不会有问题。但是,当其中一个字符串中有$时,将给出意外的输出。

如何避免仅创建禁止使用$的规则而避免此问题?

2 个答案:

答案 0 :(得分:3)

您实际上是在进行序列化和反序列化。

当前方法的问题,即使用特殊标记来分隔身体的不同部位,如果在该部位使用相同的标记,可能会导致错误。永远不能确保分隔符是唯一的。

这就是人们发明序列化概念的原因。 JSON 是一种广泛使用的格式,请参见json.org。还有很多解析器,例如Gson

假设您具有以下课程:

class Message {

    private String sender;
    private String receiver;
    private String text;

}

然后可以将其序列化为:

{
    "sender": "me",
    "receiver": "you",
    "text": "Almost any char can occur inside this, even \" or \\. They are simply escaped"
}

带有如下代码段:

Message message = new Message("me", "you",
    "Almost any char can occur inside this, even \" or \\. They are simply escaped");
    // The Java language itself uses the same escape sequences as JSON.
    // It actually works the same way

// Surprisingly easy to convert Java object to JSON
new Gson().toJson(message);

看到了吗?然后,接收方可以使用以下代码片段对其进行反序列化:

new Gson().fromJson(receivedString, Message.class);

答案 1 :(得分:0)

将字符串放在一起时,可以对字段进行转义,并用某些转义序列(例如{JQuery)替换美元,并在阅读时取消转义。