我有一个JSON字符串,我可以从网站上抓取。我只需要以下数据(原始字符串更长)以下是我计划转换为Ruby Hash的检索到的JSON:
{"day": 15, "month": 03, "year": 2012, "hour": 10, "min": 00, "sec": 00}
我使用正则表达式检索了上面的json:
targetDate:\s+(.*?)}\)/m
由于整数中有额外的零,我无法解析上面的json。 (00和03) 我尝试使用3而不是03而不是00来手动更改数字并且它有效!
所以,我猜json解析器可能无法查看那种数字。
问题是,如何清除上面检索到的JSON以删除不必要的零。也就是说,
{"day": 15, "month": 3, "year": 2012, "hour": 10, "min": 0, "sec": 0}
感谢您的帮助!
答案 0 :(得分:1)
试试这个正则表达式
json = '{"day": 15, "month": 03, "year": 2012, "hour": 10, "min": 00, "sec": 00}'
json.gsub(/\b0*(\d+)/, '\1')
#=> {"day": 15, "month": 3, "year": 2012, "hour": 10, "min": 0, "sec": 0}
修改强>
尽管不是绝对必要(参见注释),\b
字边界确保只能匹配数字开头的零。
答案 1 :(得分:1)
不是引入正则表达式,也许只是评估它:
hash = eval '{"day": 15, "month": 03, "year": 2012, "hour": 10, "min": 00, "sec": 00}'.gsub(': ', ' => ')
答案 2 :(得分:0)
json.gsub(/(?<=[: ])0+(\d+,)/, "\\1")
请注意,您可能拥有{ "someKey": "james bond: 007" }
这样的json,它将被替换为{ "someKey": "james bond: 7" }
。
json.gsub(/("\w")\s+:\s+0+(\d+)\s+,/, "\\1: \\2,")
看起来更好,但也有可能“超越”这个正则表达式。 Regexp并不适合这类问题。
好的,这是非正则表达式解决方案:
var inString = false; # check, whether current char is in string. Think of it as whether current symbol would be highlighted as string constant in editor
var out = []; # array/stack for output
var prevChar = null; # previous char. One may init to space symbol or even replace it with `out[-1]` everywhere
for (chr in jsonStr) { # iterate over symbols (chars) of a string
if (char == '"' && prevChar != "\\") inString = !inString;
if (!isDigit(out[-2])
&& prevChar == '0'
&& isDigit(chr)) { # i.e. last 3 chars match /(\D)0(\d)/
out[-1] = prevChar = chr; # make it \1\2
} else {
out.push(prevChar = chr); # just continue building string
}
}
out.join("");
考虑像javascript这样的伪代码,而不是经过测试。