为什么ruby';谁吃我的反斜杠?
以下JSON格式的示例包含一个反斜杠,如果我运行为什么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.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。