代码之家  ›  专栏  ›  技术社区  ›  pistacchio

分隔值的字符

  •  0
  • pistacchio  · 技术社区  · 15 年前

    我需要创建一个字符串来存储一对键/值数据,例如:

    key1::value1||key2::value2||key3::value3
    

    在反序列化时,如果键或值恰好包含 || ::

    7 回复  |  直到 15 年前
        1
  •  2
  •   JYelton Melchior Blausand    15 年前

    处理这种情况的一种常见方法称为转义字符或限定符。请考虑以下逗号分隔的行:

    Name,City,State
    John Doe, Jr.,Anytown,CA
    

    包含

    如果用限定符将每个数据值括起来,则解析器知道何时使用限定符 忽视 分隔符,如本例所示:

    Name,City,State
    "John Doe, Jr.",Anytown,CA
    

    您可能希望为数据编码实现类似的功能。

        2
  •  1
  •   strager    15 年前

    逃逸 || 序列化时,并在反序列化时取消它的显示。一种常见的C型逃生方法是预先准备 \ . 例如:

    { "a:b:c": "foo||bar", "asdf": "\\|||x||||:" }
    serialize => "a\:b\:c:foo\|\|bar||asdf:\\\\\|\|\|x\|\|\|\|\:"
    

    请注意 \ 需要转义(由于放在C样式的字符串中,所以需要双转义)。

        3
  •  1
  •   monkeysplayingpingpong    15 年前

    || :: 作为分隔符,但会看到 \|\| 作为两个管道字符 在键或值中。

    下一个问题是我们重载了反斜杠。问题是,“如何表示反斜杠”。这可以通过说反斜杠也被转义来解决,因此表示 \ \\ 作为 \

    或者,您可能需要重新输入信息并说 ::

        4
  •  0
  •   titaniumdecoy Mr. T    15 年前

    一个简单的解决方案是在数据中出现分隔符时转义分隔符(例如,使用反斜杠):

    Name,City,State
    John Doe\, Jr.,Anytown,CA

    \\ .

        5
  •  0
  •   danadam    15 年前

    vertical tab :-) ).

    您可以在序列化期间转义数据中的分隔符。例如:如果使用一个字符作为分隔符( key1:value1|key2:value2|... )你的数据是:

    this:is:key1   this|is|data1
    this:is:key2   this|is|data2
    

    this::is::key1:this||is||data1|this::is::key2:this||is||data2|...
    

    在反序列化过程中,每当遇到两个冒号或两个管道字符时,就知道这不是分隔符,而是数据的一部分,必须将其更改为一个字符。另一方面,每个冒号或管道字符都是分隔符。

        6
  •  0
  •   hpique    15 年前

    为键和值中的特殊字符(如“b”)使用前缀(如“a”)来存储它们。这叫做 逃逸 .

    然后通过简单地用“b”替换任何“ab”序列来解码键和值。 请记住,前缀也是一个特殊字符

    前缀: \

    : , | \

    编码:

    title:Slashdot\: News for Nerds. Stuff that Matters.|shortTitle:\\.

    已解码:

    title = Slashdot: News for Nerds. Stuff that Matters.

    shortTitle = \.

        7
  •  0
  •   Johnny Bones    11 年前

    常用的技术是转义保留字符,例如:

    推荐文章