【问题标题】:How to break a string over multiple lines and preserve spaces in YAML?如何将字符串拆分为多行并在 YAML 中保留空格?
【发布时间】:2018-02-14 01:45:54
【问题描述】:

请注意,问题类似于this one,但仍然不同,因此这些答案无法解决我的问题:

  • 用于插入控制字符,例如\x08,看来我得用双引号"
  • 所有空格都需要按照给定的方式保留。对于换行符,我明确使用\n

我有一些字符串数据需要存储在 YAML 中,例如:

  • " This is my quite long string data "
  • "This is my quite long string data"
  • "This_is_my_quite_long_string_data"
  • "Sting data\nwhich\x08contains control characters"

并在 YAML 中需要它,如下所示:

Key: "  This  is  my" +
     "  quite  long " +
     " string  data  "

只要我停留在单行就没有问题,但是我不知道如何将字符串内容放到多行。

YAML 块标量样式(>|)在这里没有帮助,因为它们不允许转义,它们甚至会进行一些空格剥离、换行符/空格替换,这对我的情况是无用的。

看起来唯一的方法似乎是使用双引号"和反斜杠\,像这样:

Key: "\
  This is \
  my quite \
  long string data\
  "

YAML online parser 中尝试此操作会得到预期的"This is my quite long string data"

但不幸的是,如果“子行”之一具有前导空格,则它会失败,如下所示:

Key: "\
  This is \
  my quite\
   long st\
  ring data\
  "

这导致"This is my quitelong string data",删除了此示例中quitelong 之间的空格。我想到解决这个问题的唯一方法是将每个子行的第一个前导空格替换为\x20,如下所示:

Key: "\
  This is \
  my quite\
  \x20long st\
  ring data\
  "

由于我选择 YAML 来获得最佳的人类可读格式,我发现 \x20 有点丑陋的解决方案。也许有人知道更好的方法?

为了保持人类可读性,我也不想为此使用!!binary

【问题讨论】:

  • 你能想出一个标题和第一段,更清楚地说明为什么这不是你链接到的现有问题的重复吗?特别是,您的情况有什么特别之处,the most up-voted answer 中的技术都不适用?我认为您的实际问题可能是“如何在多行字符串中保留前导空格?”或类似的东西。
  • 完成。将对另一个问题的引用移至第一段,并在标题中插入“保留空格”。

标签: string yaml


【解决方案1】:

代替\x20,您可以简单地转义该行的第一个非缩进空格:

Key: "\
  This is \
  my quite\
  \ long st\
  ring data\
  "

这适用于多个空格,您只需要转义第一个。

【讨论】:

    【解决方案2】:

    您的观察是正确的,控制字符只能用双引号标量表示。

    但是,如果子行(在 YAML 中:续行)具有前导空格,则解析器不会失败。是您对 YAML 标准的解释不正确。该标准明确规定,对于多行double quoted scalars

    所有前导和尾随空格字符都从内容中排除。

    所以你可以在long 之前添加任意数量的空格,这不会有什么不同。

    Python 的双引号标量的表示器(在 ruamel.yaml 和 PyYAML 中)总是将换行符表示为 \n。我不知道其他语言中的 YAML 表示器,您对此有更多控制权(例如,在双引号标量中使用双换行符来表示 \n)。因此,您可能必须编写自己的代表。

    在编写表示器时,您可以尝试使换行更智能,因为它可以最大限度地减少转义空格的数量(通过将它们放在同一行的单词之间)。 但尤其是在双倍空格与单词的比率高的字符串上,再加上操作的宽度很小,如果没有转义空格,将很难(如果不是不可能的话)。

    这样的代表应首先检查 IMO 是否需要双引号(即除了换行符之外还有控制字符)。如果不是,并且有换行符,您可能最好将字符串表示为块样式文字标量(不排除行首或行尾的空格)。

    【讨论】:

    • 我认为你过度解释了“失败”这个词。从问题的下一句可以清楚地看出,它只是意味着“未能给出预期的结果”——具体来说,它未能在示例中保留“相当”和“长”之间的空间。 YAML 规范的问题中没有提及,只是尝试了一些示例输入并没有得到所需的结果,因此规范确认 OP 已经知道的关于前导空格的事实是无关紧要的。
    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 2012-08-17
    • 2022-11-26
    • 2021-11-12
    相关资源
    最近更新 更多