如何转义 YAML 字符串中的冒号和其他特殊字符?
Posted
技术标签:
【中文标题】如何转义 YAML 字符串中的冒号和其他特殊字符?【英文标题】:How to escape colons and other special characters in a YAML string? 【发布时间】:2016-01-04 15:25:45 【问题描述】:我有以下 YAML 片段:
description: |
"API for bean consuming applications.
Examples: painted pony, lima bean"
Swagger editor 将冒号 (:
) 解释为特殊字符,尽管有引号。
根据this question 接受的答案,冒号不应被视为特殊字符。
这是 Swagger 的错误还是在引用的文本文字中使用冒号所需的转义序列?
我尝试使用YAML specification 找到这个问题,但放弃了。
我必须如何阅读该规范才能回答问题?
YAML 中的单引号 ('
) 和双引号 ("
) 有区别吗?
管道 (|
) 或大于 (>
) 构造是否也仅影响换行处理或特殊字符的处理?
【问题讨论】:
如果将此片段粘贴到Online YAML Parser中,您会发现description
值中不仅保留了冒号,还保留了引号本身。实际上,引号对于 flow 标量具有特殊含义,而不是对于用 '|' 表示的 block 标量和'>'。
对于这类问题在线编辑帮助很大:editor.swagger.io
我体验过不同的 YAML 工具的行为非常不一致,所以我不会依赖某些工具的行为来判断是否有问题。这就是我明确要求提供规范的原因。
【参考方案1】:
基于其他 cmets 中已经提供的答案:http://yaml.org/spec/1.2/spec.html#id2788097
从这里: https://yaml.org/spec/1.2/spec.html#id2776092
我发现任何引号都可以使用两个冒号来转义冒号特殊字符。即::
所以描述会变成:
description: "API for bean consuming applications. Examples:: painted pony, lima bean"
从评论更新: 看起来 swagger 特别不喜欢多行字符串,并且在编辑器中,无论引用的文本是在两行还是一行,它都显示相同。因此,我建议将双引号文本保留在一行,以避免冒号出现问题。即
description: | "API for bean consuming applications. Examples: painted pony, lima bean"
【讨论】:
不幸的是,这在 the Swagger editor 中似乎不起作用 - 我仍然收到带有双冒号的解析错误。 啊,我大摇大摆地试了一下,好像不需要双冒号。但它确实需要在同一行,所以根据这里给出的例子,它应该是:`描述:| “用于 bean 消费应用程序的 API。例如:彩绘小马、利马豆”`【参考方案2】:我认为这是 swagger 中的一个错误,但我在其他编辑器中看到了问题,例如突出显示 YAML 时。
当一个字符串标量被single quotes'....'
包围时,该字符串中唯一可以进行的转义是插入一个双单引号来表示单引号:
'It''s a good question'
当double quotes、"...."
绕过标量字符串时,您使用反斜杠 (\
) 进行转义,并且您必须至少转义反斜杠和双引号。此外,您还可以转义其他特殊字符,如换行符 (\n
),并通过在行尾前加反斜杠来转义。
YAML 规范说有 no way to escape characters inside literal scalars(以 |
开头),因此您不能插入额外的换行符或其他转义序列。
对于折叠样式 (>
),转义行为与文字标量一样。
除了普通标量(没有任何引号或>
/|
)之外的所有字符串标量都可以包含:
,后跟空格没有问题,如果编辑器解释不同,这是可以理解的(作为完整的YAML解析很昂贵),但不正确。
【讨论】:
感谢您的回答!我仍然无法找到规范的相关部分。您提供的链接将我带到“3.2.1.3。节点比较”。这与逃逸机制有什么关系? @Gustave 抱歉,粘贴到错误的链接中。我已经更新了它。它在示例 8.8 之前的句子中 值得一提的是,链接的规范适用于 YAML 1.2,其中包含 YAML 1.1 的重大更改。 PyYAML 使用 1.1 规范。参考:pyyaml.org/wiki/PyYAML【参考方案3】:我遇到了完全相同的问题,发现使用 HTML 转义码可以工作 :
,这就是我所采用的方法。
【讨论】:
所以要在 YAML 中转义这些类型的字符,是否应该始终使用 HTML 代码? 你能用参考文献备份吗? yaml 规范 (1.2.2) 没有提到entity
或 &#
所以你所描述的听起来是特定的实现。此外,&
不在需要转义的字符列表中,这意味着对 HTML 实体的支持。
也许 Swagger 在 2017 年初对 YAML 的实现并不完全符合规范?
这个问题似乎(也)是关于 YAML 的,所以我会避免在没有参考或对特定实现的适用性有一些额外限制的情况下发表声明。当我发表评论时,我是 YAML 的新手,这个答案让我感到不必要的困惑。以上是关于如何转义 YAML 字符串中的冒号和其他特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章