Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么ruby';谁吃我的反斜杠?_Ruby_Regex_Escaping_Backslash - Fatal编程技术网

为什么ruby';谁吃我的反斜杠?

为什么ruby';谁吃我的反斜杠?,ruby,regex,escaping,backslash,Ruby,Regex,Escaping,Backslash,以下JSON格式的示例包含一个反斜杠,如果我运行JSON.load,反斜杠将消失: JSON.load('{ "88694": { "regex": ".*?\. (CVE-2015-46055)" } }') # => {"88694"=>{ "regex"=>".*?. (CVE-2015-46055)"}} 我怎样才能保留反斜杠 我的目标是拥有这种结构,并在需要时读取文件,将JSON加载到哈希中,然后搜索那些正则表达式 更新1 这是我想要的一个例子 irb> "s

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

JSON.load('{ "88694": { "regex": ".*?\. (CVE-2015-46055)" } }')
# => {"88694"=>{ "regex"=>".*?. (CVE-2015-46055)"}}
我怎样才能保留反斜杠

我的目标是拥有这种结构,并在需要时读取文件,将JSON加载到哈希中,然后搜索那些正则表达式

更新1

这是我想要的一个例子

irb> "stack.overflow"[/.*?\./]
=> "stack."
我无法将正则表达式从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)"}} 
str2
是我们想要的,因为

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在这里做什么。

您是否尝试过用另一个反斜杠来逃避反斜杠?是的,我尝试过。我的目标不仅仅是打印正则表达式,而是实际使用它。我不理解“更新1”<代码>“stack.overflow”[/.*?\./]返回
“stack.”
。加载的JSON字符串不包含反斜杠字符。它包含一个转义句点。我想去月经。但由于反斜杠消失,圆点变成了“任意字符”的正则表达式。我需要那个反斜杠。值得注意的是,
\.
在JSON字符串中在技术上是无效的。反斜杠后面可以是任何字符
“\/bnfrt
u
,后跟四个十六进制数字(奇怪的是
/
在该列表中;我想知道为什么)。一些JSON解析器会抛出一个错误,但Ruby只是出于某种原因省略了反斜杠。+1,但是。简而言之:我有一个文本,我有我的正则表达式,不幸的是,我不能从JSON中应用我的正则表达式。你看,放上show me“\”,但我无法将一个反斜杠传递给这个:Some\u text.match(/regex/)@Cary,谢谢你的回答。之所以使用JSON文件,是因为我在代码中有30多个条件,只是为了用我的文本替换一些文本,所以我考虑将所有条件移动到JSON文件中,以便能够在没有意大利面代码的情况下,随时读取文件并找到我需要的条件。不幸的是,这个想法有这样的弱点字母S。