从字符串中删除反斜杠(转义字符)

Huy*_*Huy 17 ruby

我正在尝试使用自己的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)


Ama*_*dan 9

你的字符串中没有反斜杠.您的字符串中有引号,当放在双引号字符串中时需要对其进行转义.看:

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,因为它有很多很容易错过的角落案例(其中主要是讽刺的是,逃脱的角色).


Dan*_*Dan 5

input.gsub(/[\"]/,"") 也会起作用。