我正在尝试使用自己的JSON解析器.我有一个我想要标记的输入字符串:
input = "{ \"foo\": \"bar\", \"num\": 3}"
如何删除转义字符\
,使其不是我的令牌的一部分?
目前,我使用的解决方案delete
:
tokens = input.delete('\\"').split("")
=> ["{", " ", "f", "o", "o", ":", " ", "b", "a", "r", ",", " ", "n", "u", "m", ":", " ", "3", "}"]
但是,当我尝试使用时gsub
,它找不到任何东西\"
.
tokens = input.gsub('\\"', '').split("")
=> ["{", " ", "\"", "f", "o", "o", "\"", ":", " ", "\"", "b", "a", "r", "\"", ",", " ", "\"", "n", "u", "m", "\"", ":", " ", "3", "}"]
我有两个问题:
1.为什么gsub在这种情况下不起作用?
2.如何删除反斜杠(转义)字符?我目前必须删除带引号的反斜杠字符才能使其工作.
Ari*_*iao 29
当你写:
input = "{ \"foo\": \"bar\", \"num\": 3}"
Run Code Online (Sandbox Code Playgroud)
存储在输入中的实际字符串是:
{ "foo": "bar", "num": 3}
Run Code Online (Sandbox Code Playgroud)
\"
这里的转义由Ruby解析器解释,因此它可以区分字符串的边界(最左边和最右边"
)和"
字符串中的普通字符(转义的字符串).
String#delete
删除指定第一个参数的字符集,而不是模式.将删除第一个参数中的所有字符.所以通过写作
input.delete('\\"')
Run Code Online (Sandbox Code Playgroud)
你有一个包含all的字符串\
并"
从中删除input
,而不是\"
删除所有序列的字符串input
.这对你的情况是错误的.一段时间后它可能会导致意外行为.
String#gsub
但是,替换模式(正则表达式或纯字符串).
input.gsub('\\"', '')
Run Code Online (Sandbox Code Playgroud)
表示查找全部\"
(序列中的两个字符)并用空字符串替换它们.由于没有\
在input
,没有得到更换.你需要的是:
input.gsub('"', '')
Run Code Online (Sandbox Code Playgroud)
你的字符串中没有反斜杠.您的字符串中有引号,当放在双引号字符串中时需要对其进行转义.看:
input = "{ \"foo\": \"bar\", \"num\": 3}"
puts input
# => { "foo": "bar", "num": 3}
Run Code Online (Sandbox Code Playgroud)
你正在删除 - 幽灵.
input.delete('\\"')
Run Code Online (Sandbox Code Playgroud)
将删除其参数中的任何字符.因此,您删除任何不存在的反斜杠,并删除所有引号.如果没有引号,默认的显示方法(inspect
)将不需要转义任何内容.
input.gsub('\\"', '')
Run Code Online (Sandbox Code Playgroud)
将尝试删除\"
不存在的序列,因此gsub
最终无所作为.
确保你知道字符串表示(puts input.inspect
)和字符串content(puts input
)之间的区别是什么,并注意反斜杠作为表示的工件.
也就是说,我必须回应emaillenin:编写一个正确的JSON解析器并不简单,你不能用正则表达式(或者至少不使用常规正则表达式;可能使用Oniguruma).它需要一个适当的解析器,如treetop或rex/racc,因为它有很多很容易错过的角落案例(其中主要是讽刺的是,逃脱的角色).
归档时间: |
|
查看次数: |
28648 次 |
最近记录: |