以下JSON格式的示例包含一个反斜杠,如果运行JSON.load,反斜杠将消失:

JSON.load('{ "88694": { "regex": ".*?\. (CVE-2015-46055)" } }')
# => {"88694"=>{ "regex"=>".*?. (CVE-2015-46055)"}}

我怎样才能保留反斜杠?
我的目标是拥有这个结构,并且在需要的时候,读取文件,将JSON加载到Hash中,并搜索那些正则表达式。
更新1
这是我想要的一个例子。
irb> "stack.overflow"[/.*?\./]
=> "stack."

我无法将regex从json传递到字符串以捕获它“.”,因为“\”消失了。

最佳答案

str = '{ "88694": { "regex": ".*?\. (CVE-2015-46055)" } }'
  #=> "{ \"88694\": { \"regex\": \".*?\\. (CVE-2015-46055)\" } }"

str.chars
  #=> ["{", " ", "\"", "8", "8", "6", "9", "4", "\"", ":", " ", "{", " ",
  #   "\"", "r", "e", "g", "e", "x", "\"", ":", " ", "\"", ".", "*", "?",
  #   "\\", ".",
  #   ~~~   ~~
  #   " ", "(",..., "}", " ", "}"]

这表明str确实包含一个反斜杠字符,后跟一个句点原因是str用单引号括起来\.只有在将str括在双引号中时才会被视为转义句点:
 "{ '88694': { 'regex': '.*?\. (CVE-2015-46055)' } }".chars[25,3]
   #=> ["?", ".", " "]

str的返回值将单引号字符串转换为双引号字符串:
"{ \"88694\": { \"regex\": \".*?\\. (CVE-2015-46055)\" } }"

\\是一个反斜杠字符,后跟句点。现在可以使用双引号对句点进行转义,但它前面没有反斜杠,只有反空格字符。
现在,我们再添加一个反斜杠,看看会发生什么:
str1 = '{ "88694": { "regex": ".*?\\. (CVE-2015-46055)" } }'
str1.chars == str.chars
  #=> true

结果是一样的。这是因为单引号支持转义序列\\(单反斜杠)(只有一个其他的:\'[单引号])。
现在我们添加第三个反斜杠:
str2 = '{ "88694": { "regex": ".*?\\\. (CVE-2015-46055)" } }'
str2.chars
  #=> ["{", " ", "\"", "8", "8", "6", "9", "4", "\"", ":", " ", "{", " ",
  #   "\"", "r", "e", "g", "e", "x", "\"", ":", " ", "\"", ".", "*", "?",
  #   "\\", "\\", ".",
  #   ~~~~  ~~~~  ~~~
  #   " ", "(",..., "}", " ", "}"]

惊讶吗?\\生成一个反斜杠字符(单引号中的转义反斜杠),\生成第二个反斜杠字符(单引号中的反斜杠)和.是单引号中的句点。
我们得到:
s = {"88694"=>{"regex"=>".*?\\. (CVE-2015-46055)"}.to_json

JSON.parse(str)
  #=> {"88694"=>{"regex"=>".*?. (CVE-2015-46055)"}}
JSON.parse(str1)
  #=> {"88694"=>{"regex"=>".*?. (CVE-2015-46055)"}}
JSON.parse(str2)
  #=> {"88694"=>{"regex"=>".*?\\. (CVE-2015-46055)"}}

我们想要的是
JSON.parse(str2)["88694"]["regex"].chars[2,4]
  #=> ["?", "\\", ".", " "]

我们也可以反过来:
js = {"88694"=>{"regex"=>".*?\\. (CVE-2015-46055)"}}.to_json
  #=> "{\"88694\":{\"regex\":\".*?\\\\. (CVE-2015-46055)\"}}"

'{"88694":{"regex":".*?\\\. (CVE-2015-46055)"}}' == js
  #=> true

此字符串与删除引用的子字符串以外的所有空格后的str2相同。
json似乎将两个连续的反斜杠字符视为一个反斜杠字符。请看@Jordan的评论。
也许读者可以详细说明json正在做什么。

关于ruby - 为什么ruby的JSON解析器会吃掉我的反斜杠?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37328677/

10-13 04:44