繁体   English   中英

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

[英]Removing backslash (escape character) from a string

我正在尝试使用自己的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.如何删除反斜杠(转义)字符? 我目前必须删除带引号的反斜杠字符才能使其工作。

当你写:

input = "{ \"foo\": \"bar\", \"num\": 3}"

存储在输入中的实际字符串是:

{ "foo": "bar", "num": 3}

转义\\"这里是Ruby的语法分析器解释,以便它可以字符串的边界(最左边和最右边区分" ),以及普通字符"在字符串(转义的)。

String#delete删除指定第一个参数的字符集 ,而不是模式。 将删除第一个参数中的所有字符。 所以通过写作

input.delete('\\"')

你有一个字符串包含所有\\"input删除,而不是从input删除所有\\"序列的字符串。 这对你的情况是错误的。 一段时间后它可能会导致意外行为。

但是, String#gsub替换模式(正则表达式或普通字符串)。

input.gsub('\\"', '')

意味着找到所有\\" (序列中的两个字符)并用空字符串替换它们。由于input没有\\ ,没有任何内容被替换。你需要的是:

input.gsub('"', '')

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

input = "{ \"foo\": \"bar\", \"num\": 3}"
puts input
# => { "foo": "bar", "num": 3}

你正在删除 - 幽灵。

input.delete('\\"')

将删除其参数中的任何字符。 因此,您删除任何不存在的反斜杠,并删除所有引号。 如果没有引号,默认显示方法( inspect )将不需要转义任何内容。

input.gsub('\\"', '')

将尝试删除不存在的序列\\" ,因此gsub最终无所事事。

确保你知道字符串表示( puts input.inspect )和字符串内容( puts input )之间的区别是什么,并注意反斜杠作为表示的工件。

也就是说,我必须回应emaillenin:编写一个正确的JSON解析器并不简单,你不能用正则表达式(或者至少不使用常规正则表达式;可能使用Oniguruma)。 它需要一个适当的解析器,如treetop或rex / racc,因为它有很多很容易错过的角落案例(其中主要是讽刺的是,逃脱的角色)。

使用正则表达式模式:

> input = "{ \"foo\": \"bar\", \"num\": 3}"
> input.gsub(/"/,'').split("")

> => ["{", " ", "f", "o", "o", ":", " ", "b", "a", "r", ",", " ", "n", "u", "m", ":", " ", "3", "}"]

这实际上只是一个双引号。 斜线是逃避它。

input.gsub(/[\\"]/,"")也可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM