当前位置: 首页 > 知识库问答 >
问题:

YAML:错误解析包含方括号作为其第一个字符的字符串

韦绍晖
2023-03-14

我正在用Ruby解析一个YAML文件,其中一些输入导致心理语法错误:

require 'yaml'

example = "my_key: [string] string"
YAML.load(example)

导致:

Psych::SyntaxError: (<unknown>): did not find expected key
          while parsing a block mapping at line 1 column 1
from [...]/psych.rb:456:in `parse'

我从我无法控制的外部API接收到这个YAML。我可以看到,使用my_key:'[string]string'编辑输入以强制解析为字符串,如“我需要YAML中字符串的引号吗?”中所述,修复了这个问题,但我无法控制如何接收输入。

是否有办法强制将输入解析为某些键的字符串,例如my_key?是否有成功解析此YAML的解决方法?

共有3个答案

皇甫逸清
2023-03-14

有一个非常自然和简单的解决方案。如果您希望有字符串上下文,可以始终在其周围加引号:

 YAML.load "my_key: '[string]'"
=> {"my_key"=>"[string]"}
葛俊
2023-03-14

它不起作用,因为方括号在YAML中有特殊含义,表示数组:

YAML.load "my_key: [string]"
#⇒ {"my_key"=>["string"]}

而条形图是无效的类型。应明确避开方括号

YAML.load "my_key: \\[string\\] string"
#⇒ {"my_key"=>"\\[string\\] string"}

此外,还可以实现定制的Psych解析器。

路伟
2023-03-14

一种方法是在将响应读取为YAML之前对其进行处理。假设它是一个字符串,可以使用正则表达式将有问题的模式替换为有效的模式。即。

resp_str = "---\nmy_key: [string] string\n"
re = /(\: )(\[[a-z]*?\] [a-z]*?)(\n)/
resp_str.gsub!(re, "#{$1}'#{$2}'#{$3}")
#=> "---\n" + "my_key: '[string] string'\n"

那你就可以

YAML.load(resp_str)
#=> {"my_key"=>"[string] string"}
 类似资料:
  • 当我使用之类的东西时,它仍然会触发,就像连字符无效一样。我尝试了和

  • 题目描述 给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短。请问,如何最快地判断字符串B中所有字母是否都在字符串A里? 为了简单起见,我们规定输入的字符串只包含大写英文字母,请实现函数bool StringContains(string &A, string &B) 比如,如果是下面两个字符串: String 1:ABCD String 2:BAD 答案是true,即Stri

  • 问题内容: java中有没有一种方法可以用指定数量的指定字符创建字符串?就我而言,我需要创建一个包含10个空格的字符串。我当前的代码是: 有没有更好的方法来完成同一件事。特别是我想快速(在执行方面)。 问题答案: for循环将由编译器优化。在像您这样的情况下,您无需自己担心优化。信任编译器。 顺便说一句,如果有一种方法可以创建一个包含n个空格字符的字符串,那么它的编码方式就和您刚才一样。

  • 符号可以被视为运算符或负号。如果位于开始,则应将其视为负号和抹去字符串的减法。这仅适用于符号,而将始终是加号。如何实现此目的? 输入: 输出: 到目前为止我一直在尝试

  • 我如何修改这个字符串: 所以它会回来的 (然后我可以把它分开)? 字符串中的数字可以不同。 我试过用。替换

  • 这个问题类似于我之前的问题拆分一个包含破折号和减号的字符串。但我问错了,然后它得到了稍微不同的语义,人们从这个角度回答(包括)。因此,与其修改这个问题,我认为最好是提出一个新问题。 我必须拆分一个包含连字符-减号和减号的字符串。我尝试根据Unicode字符(https://en.wikipedia.org/wiki/Hyphen#Unicode)进行拆分,但考虑到减号与连字符-减号相同。有什么方法