前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「译文」如何在YAML中输入多行字符串?

「译文」如何在YAML中输入多行字符串?

作者头像
东风微鸣
发布2022-04-22 14:30:09
5.1K0
发布2022-04-22 14:30:09
举报
文章被收录于专栏:东风微鸣技术博客

👉️URL: https://stackoverflow.com/questions/3790454/how-do-i-break-a-string-in-yaml-over-multiple-lines 📝Description: In YAML, I have a string that's very long. I want to keep this within the 80-column (or so) view of my editor, so I'd like to break the string. What's the syntax for this?

问题

在YAML中,我有一个非常长的字符串。我希望将其保存在编辑器的80列(大约)视图中,因此我想中断字符串。它的语法是什么? 换句话说,我有:

代码语言:javascript
复制
Key: 'this is my very very very very very very long string'

我想要这样(或类似的效果):

代码语言:javascript
复制
Key: 'this is my very very very ' +
     'long string'

我想像上面那样使用引号,所以我不需要转义字符串中的任何内容

答案

在 YAML 中有很多不同的方法来编写多行字符串。

TL;DR

符号 >

大多数情况下使用: > 去掉内部换行符,但是在末尾会有一个换行符:

代码语言:javascript
复制
  key: >
    Your long
    string here.
符号 |

如果您希望这些换行符保持为\n(举例,就是嵌入段落的标记),请使用|

代码语言:javascript
复制
  key: |
    ### Heading

    * Bullet
    * Points
>-|-

如果不希望在末尾追加换行符,则使用>-|-.

符号 ""

如果你需要在单词中间分隔行,或者想按字面意思键入换行符\n:

代码语言:javascript
复制
  key: "Antidisestab\
   lishmentarianism.\n\nGet on it."

YAML 太诡异了🤬🤬🤬

块标量样式(>|)

它们允许像\"这样的字符不需要转义,并在字符串的末尾添加一个新行(\n)。

> 折叠样式[1]删除了字符串中的单个换行符(但在结尾处增加一个,并将双换行符转换为单换行符)。

代码语言:javascript
复制
Key: >
  this is my very very very
  long string

结果是: this is my very very very long string\n

额外的前导空间被保留并导致额外的换行符。请参阅下面的注意。

👍️ 建议: 字符串 wrap line 使用这个。通常这就是你想要的。

| 字面风格[2]将字符串中的每一个换行(newline)都变成一个字面换行(literal newline),并在最后加上一个换行。

代码语言:javascript
复制
Key: |
  this is my very very very 
  long string

结果是: this is my very very very\nlong string\n

下面是YAML规范1.2[3]的官方定义:

📚️ Reference: 标量内容可以用块状符号来写,使用字面风格(用|表示),其中所有的换行符都是显式的。另外,也可以使用折叠式风格(用>表示),其中每个换行符都被折叠成一个空格,除非它结束了一个空行或一个缩进较大的行。

👍️ 建议: 将格式化的文本(特别是Markdown)作为值插入使用这个 |

带有块咬合指示器(block chomping indicator)的块状样式(>-, |-, >+, |+)

你可以通过添加一个块咬合指示符[4]字符来控制字符串中最后一个新行和任何尾随空行(\n\n)的处理:

>, |: “剪辑(clip)”:保留换行,删除末尾空行。

>-, |-: "strip":删除换行,删除末尾的空行。

>+, |+: "keep":保持换行,末尾为空行。

“流(Flow)”标量风格 (, ", ')

它们有有限的转义,并构造一个没有新行字符的单行字符串。它们可以在与键相同的行开始,或者在前面附加换行符,这些换行符被剥离。双行换行符变成一个换行符。

plain style[5](没有转义,没有#:组合,第一个字符不能是"'或许多其他标点字符):

代码语言:javascript
复制
Key: this is my very very very 
  long string

👍️ 建议: 避免这样用。可能看起来很方便,但你可能会因为不小心使用了禁用的标点符号而搬起石头砸自己的脚,并引发语法错误。

双引号风格[6] (\"必须被\转义,换行符可以用一个\n序列插入,行可以不带空格的\结尾连接)

结果是:

代码语言:javascript
复制
"this is my very very \"very\" loooong string.\n\nLove, YAML." 

👍️ 建议: 仅在非常具体的情况下使用。这是唯一可以在不添加空格的情况下将一个很长的标记(如URL)跨行分隔的方法。也许在中间添加换行符是很有用的。

单引号风格[7] (Literal ' 必须是成对的,没有特殊字符,可能用于表达以双引号开头的字符串):

代码语言:javascript
复制
Key: 'this is my very very "very"
  long string, isn''t it.'

结果是: "this is my very very \"very\" long string, isn't it."

👍️ 建议: 避免。很少有好处,大多是不便。

带 缩进指示器的块样式

如果上面的内容对你来说还不够,你可以添加一个“块缩进指示符[8]”(如果你有块咬合指示符的话,在你的块咬合指示符之后):

代码语言:javascript
复制
- >8
        My long string
        starts over here
- |+1
 This one
 starts here

注:前导空格采用折叠样式(>)

如果你以折叠的方式在非首行开始插入额外的空格,它们将被保留,并带有额外的换行符。(这种情况不会发生在流样式上。)第6.5节[9]:

📚️ Reference: 此外,折叠不适用于包含前导空格的文本行周围的换行符。注意,这种更缩进的行可能只包含这样的前导空格。

代码语言:javascript
复制
- >
    my long
      string

    many spaces above
- my long
      string

    many spaces above

结果是: ["my long\n string\n \nmany spaces above\n","my long string\nmany spaces above"]

总结😵😵😵

在该表中,_表示空格字符。\n表示“换行符”(在JavaScript中为\n),“其他功能”下除外。“前导空格”应用于第一行之后(建立缩进):

示例🥴🥴🥴

注意“空格”之前一行的末尾空格。

代码语言:javascript
复制
- >
  very "long"
  'string' with

  paragraph gap, \n and        
  spaces.
- | 
  very "long"
  'string' with

  paragraph gap, \n and        
  spaces.
- very "long"
  'string' with

  paragraph gap, \n and        
  spaces.
- "very \"long\"
  'string' with

  paragraph gap, \n and        
  s\
  p\
  a\
  c\
  e\
  s."
- 'very "long"
  ''string'' with

  paragraph gap, \n and        
  spaces.'
- >- 
  very "long"
  'string' with

  paragraph gap, \n and        
  spaces.

[
  "very \"long\" 'string' with\nparagraph gap, \\n and         spaces.\n", 
  "very \"long\"\n'string' with\n\nparagraph gap, \\n and        \nspaces.\n", 
  "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \\n and         spaces."
]

References

[1] 折叠样式: https://yaml.org/spec/1.2/#style/block/folded [2] 字面风格: https://yaml.org/spec/1.2/#style/block/literal [3] YAML规范1.2: https://yaml.org/spec/1.2/#id2760844 [4] 块咬合指示符: https://yaml.org/spec/1.2/#chomping// [5] plain style: https://yaml.org/spec/1.2/#style/flow/plain [6] 双引号风格: https://yaml.org/spec/1.2/#style/flow/double-quoted [7] 单引号风格: https://yaml.org/spec/1.2/#style/flow/single-quoted [8] 块缩进指示符: https://yaml.org/spec/1.2/#id2793979 [9] 第6.5节: https://yaml.org/spec/1.2/#id2779048

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 东风微鸣技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 答案
    • TL;DR
      • 符号 >
      • 符号 |
      • >- 或 |-
      • 符号 ""
    • 块标量样式(>,|)
      • 带有块咬合指示器(block chomping indicator)的块状样式(>-, |-, >+, |+)
        • “流(Flow)”标量风格 (, ", ')
          • 带 缩进指示器的块样式
            • 注:前导空格采用折叠样式(>)
            • 总结😵😵😵
              • 示例🥴🥴🥴
                • References
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档