YAML中多行字符串的处理方法

YAML中多行字符串的处理方法

技术背景

在使用YAML时,经常会遇到需要处理多行字符串的情况。YAML提供了多种方式来编写多行字符串,每种方式都有其特点和适用场景。了解这些方式可以帮助我们更灵活地处理字符串,满足不同的需求。

实现步骤

块标量样式(>|

  • >(折叠样式):会去除字符串内部的单个换行符,但在结尾添加一个换行符,同时将双换行符转换为单换行符。
1
2
3
Key: >
this is my very very very
long string

输出结果:this is my very very very long string\n

建议:通常情况下,这种方式能满足大多数需求。

  • |(字面样式):将字符串内的每个换行符都转换为文字换行符,并在结尾添加一个换行符。
1
2
3
Key: |
this is my very very very
long string

输出结果:this is my very very very\nlong string\n

建议:用于插入格式化文本(特别是Markdown)作为值。

带有块截断指示符的块样式(>-|->+|+

可以通过添加块截断指示符字符来控制字符串中最后一个换行符以及任何尾随空行(\n\n)的处理方式:

  • >|:“clip”,保留换行符,去除尾随空行。
  • >-|-:“strip”,去除换行符,去除尾随空行。
  • >+|+:“keep”,保留换行符,保留尾随空行。

“流”标量样式(``,"'

这些样式的转义功能有限,会构造一个没有换行符的单行字符串。它们可以与键在同一行开始,或者先有额外的换行符,这些换行符会被去除。双换行符会变成一个换行符。

  • 纯样式(plain style):无转义,不能有#:组合,第一个字符不能是"'或许多其他标点字符。
1
2
Key: this is my very very very 
long string

建议:避免使用,因为容易因意外使用禁止的标点而触发语法错误。

  • 双引号样式(double - quoted style)\" 必须用 \ 转义,换行符可以用字面 \n 序列插入,行可以用尾随 \ 连接而不添加空格。
1
2
Key: "this is my very very \"very\" loooo\
ng string.\n\nLove, YAML."

输出结果:"this is my very very \"very\" loooong string.\n\nLove, YAML."
建议:在非常特定的情况下使用,例如打破很长的令牌(如URL)而不添加空格。

  • 单引号样式(single - quoted style):字面 ' 必须加倍,无特殊字符,可能用于表示以双引号开头的字符串。
1
2
Key: 'this is my very very "very"
long string, isn''t it.'

输出结果:"this is my very very \"very\" long string, isn't it."
建议:避免使用,好处少且不便。

带有缩进指示符的块样式

可以在块截断指示符(如果有的话)之后添加“块缩进指示符”:

1
2
3
4
5
6
- >8
My long string
starts over here
- |+1
This one
starts here

核心代码

块标量样式示例

1
2
3
4
5
6
7
8
9
10
11
# 折叠样式
key1: >
Your long
string here.

# 字面样式
key2: |
### Heading

* Bullet
* Points

带有块截断指示符的块样式示例

1
2
3
4
5
6
7
8
9
10
11
# 去除结尾换行符
key3: >-
this is a string
without a final newline

# 保留结尾换行符和尾随空行
key4: |+
this is a string
with trailing newlines


“流”标量样式示例

1
2
3
4
5
6
# 双引号样式
key5: "this is a very \
long string with newlines inserted"

# 单引号样式
key6: 'this is a string with ''single quotes'''

最佳实践

  • 当需要将多行文本合并为一行时,使用 >>-
  • 当需要保留文本的原始格式(如Markdown段落)时,使用 ||-
  • 当需要在字符串中间换行且不添加空格时,使用双引号和 \ 转义换行符。

常见问题

折叠样式(>)中的前导空格问题

如果在折叠样式的非第一行开头插入额外的空格,这些空格将被保留,并会额外添加一个换行符。例如:

1
2
3
4
5
- >
my long
string

many spaces above

输出结果:"my long\n string\n \nmany spaces above\n"

在Symfony中使用YAML和Twig进行翻译时的换行问题

在Symfony中使用YAML和Twig进行翻译时,如果想要在Javascript中使用多行翻译,在yml中使用 >- 可以避免翻译后出现多余的换行符。例如:

1
2
3
4
key: >-
This is a
multi line
translation.

双引号样式中续行以空格开头的问题

在双引号样式中,如果续行以空格开头,需要对空格进行转义,否则空格会被去除。例如:

1
2
3
key: "String\
\ with lon\
g content"